4

我已经用 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 加载和分析的分析“快照”?
4

5 回答 5

5

在分析器“连接”之前,无法暂停已分析的应用程序;你根本不需要这样做。

相反,请执行以下操作:

  • 从启动时打开所需的分析模式。例如,如果您需要分析 CPU 使用情况,请使用相应的启动选项“采样”或“跟踪”启动 CPU 采样或 CPU 跟踪。请参阅http://www.yourkit.com/docs/80/help/additional_agent_options.jsp

  • 如果分析的应用程序运行时间很短,请使用“onexit=snapshot”启动选项在退出时启用快照捕获。稍后在分析器 UI 中打开捕获的快照进行分析。

于 2010-04-02T10:17:01.720 回答
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 来完成这一切,但我不知道这样的方式。

于 2010-04-01T21:32:12.320 回答
1

YourKit 的 onexit=snapshot 选项在 JVM 退出时将快照文件保存在 $HOME/Snapshots 下。您可以将此快照加载到 YourKit GUI 中以供以后分析。有关更多详细信息,请参阅他们网站上的此页面

于 2010-04-01T23:40:33.843 回答
1

您可以通过 Eclipse 启动它,它有一个在应用启动时启动的 YourKit 插件。

于 2010-04-01T21:40:23.147 回答
0

#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();
于 2010-04-01T21:34:47.737 回答