如何使用YourKit Java Profiler连接到Java命令行工具?

时间:2010-04-01 21:19:14

标签: java connection profiling yourkit

我在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连接?

  1. 我可以添加一个命令行选项 这将暂停输入, 我不会按它返回 继续,直到我连接到它 来自YourKit。
  2. 我可以使用YourKit API吗? 添加到我的工具,将导致它 阻止,直到我连接 YourKit?
  3. 是否有YourKit API或java 命令行选项 创建一个我的分析“快照” 可以加载和分析以后(之后 命令行工具已完成) 使用YourKit?

5 个答案:

答案 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();