我在Java中构建了一个命令行工具,我现在想用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连接?
答案 0 :(得分:5)
在探查器之前无法暂停已分析的应用程序 “所连接”;你根本不需要这样做。
相反,请执行以下操作:
从启动时打开所需的性能分析模式。例如,如果你 需要分析CPU使用情况,启动CPU采样或CPU跟踪 具有相应的启动选项“采样”或“跟踪”。 请参阅http://www.yourkit.com/docs/80/help/additional_agent_options.jsp
如果配置文件应用程序短时间运行,请启用快照捕获 退出并使用“onexit = snapshot”启动选项。后来开放捕获 用于分析的概要分析器中的快照。
答案 1 :(得分:2)
我不知道有一个YourKit选项来执行此操作(这并不是说没有),但 是一个Java远程调试选项来执行此操作。
除了YourKit代理选项外,请尝试将以下内容添加到命令行:
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
这会导致VM在启动后立即挂起,等待调试器在端口8000上连接.YourKit本身不是调试器,但像Eclipse或Netbean这样的IDE将完成这项工作,基本jdb命令行。
因此运行命令,同时设置两个选项,连接YourKit,然后使用调试器连接到调试端口,这将触发VM继续执行,允许YourKit获取所需的数据。
使用YourKit做这一切会更好,但我知道没有这种方式。
答案 2 :(得分:1)
您可以通过Eclipse启动它,它有一个在应用启动时启动的YourKit插件。
答案 3 :(得分:1)
YourKit的onexit = snapshot选项将快照文件保存在JVM出口的$ HOME / Snapshots下。您可以将此快照加载到YourKit GUI中以供以后分析。 有关详细信息,请参阅其网站上的this page。
答案 4 :(得分:0)
#3的答案是肯定的,你可以使用一个API来让你的应用程序产生分析结果,然后你可以检查你的。
查看API docs以及Command line tool to control profiling
以下是使用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();