我怎么连接到一个Java命令行工具与YourKit Java档器?
-
23-09-2019 - |
题
我已经建立一个命令行的工具,它现在,我谨简介与YourKit.我启动命令行工具喜欢的东西:
$ java -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3
它运行,以完成在不到2秒钟。
在阅读 http://www.yourkit.com/docs/80/help/agent.jsp, 我试图如下:
$ java -agentpath:/home/dspitzer/yjp-8.0.24/bin/linux-x86-32/libyjpagent.so -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3
...我得到:
[YourKit Java Profiler 8.0.24] JVMTI version 3001016d; 14.3-b01; Sun Microsystems Inc.; mixed mode, sharing; Linux; 32-bit JVM
[YourKit Java Profiler 8.0.24] Profiler agent is listening on port 10001...
[YourKit Java Profiler 8.0.24] *** HINT ***: To get profiling results, connect to the application from the profiler UI
...
(然后对工具的运行,以完成并退出。)
我猜(默认情况下,至少)YourKit是设计只能连接到正在运行的应用程序。
我应该怎样修改我的命令行的工具,以允许连接从YourKit?
- 我可以添加一个命令行选项 这将有它暂停输入, 我不会回到 继续,直到我已经连接到它 从YourKit.
- 是否有一个YourKit API,我可以 加入到我的工具,这会导致它 来阻止我已经连接 YourKit?
- 是否有一个YourKit API或java 命令行的选择,会 创建一个分析"快照",我 可以负载和分析以后(后 该命令行工具已完成) 与YourKit?
解决方案
有没有办法要暂停分析的应用程序,直到探查 "连接";你根本不需要这样做。
相反,请做到以下几点:
打开所需的分析的模式,从启动。例如,如果您 需要配置占用、开始或CPU采样,或者的CPU跟踪 与相应的启动选项中"取样"或"追踪".看看 http://www.yourkit.com/docs/80/help/additional_agent_options.jsp
如果分析的应用程序是短期运行,启用快照捕捉 退出"onexit=快照"启动的选择。稍后开放的捕获 快照在探查的用户界面分析。
其他提示
我不知道还有一个YourKit选择这样做(这并不是说,没有一个),但也有 是 Java遥调试中选择这样做。
尽量添加以下您的命令行,除YourKit剂的选择:
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
这应该导致VM暂停尽快开始了,在等待一个调试器连接在港口8000.YourKit本身不是一个调试器,但IDE喜欢食或Netbean将做的工作,作为将基本的 jdb 命令行。
所以运行的命令,这两个选项的设置、连接YourKit,然后用一个调试器连接到"调试"口,这将触发虚拟机继续执行,允许YourKit得到你需要的数据。
它将更好地这样做的所有使用YourKit,但我知道没有这样的方式。
你可以启动它通过日食,其中有一个YourKit插件,发布在程序启动。
YourKit的onexit=快照选项节省了快拍下的文件$HOME/快照上JVM出口。你可以载入这个快照入YourKit GUI后分析。看看 这页 在他们的网站了解更多详情。
答案#3是肯定的,那里有一个API可用于将应用程序产生的分析结果,YourKit然后可以审查。
看看 API文档, ,并且还 命令行的工具,以控制的分析
这是一个例子使用API(我没有尝试过这种代码):
Controller ykController = new Controller();
ykController.enableStackTelemetry();
ykController.enableExceptionTelemetry();
ykController.startCPUProfiling(ProfilingModes.CPU_TRACING,Controller.DEFAULT_FILTERS);
ykController.startAllocationRecording(false,0,false,0);
YourMainClass.main(args);
String snapshotLocation = ykController.captureMemorySnapshot();