java - 如何在生产中生成 cpu 快照?

标签 java profiling

使用 VisualVM,我可以附加到本地 java 进程,启动/停止 CPU 分析,并生成快照。我什至不需要使用任何特殊代理等来检测流程。

是否可以在 headless 生产服务器上做同样的事情?我知道我可以配置进程以远程附加调试器,但我想尽量减少更改客户环境的数量和影响。我只想运行一个命令来分析一段时间并生成一个快照文件,我可以将其 scp 到我的工作站以使用 VisualVM 或等效工具进行分析。

最好,我运行的任何程序都应该是可自由再分发的,这样我就可以将它与我的 Java 应用程序捆绑在一起,并在客户环境中可用。

理想情况下,就像使用 VisualVM 一样,我希望能够在不重新启动的情况下连接到正在运行的系统。

到目前为止,我发现最接近的是使用 hprof 进行检测:

  java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname

但这需要重新启动才能开始分析,然后再重新启动才能停止,因为我看不到在运行时打开和关闭采样的方法。

有没有更好的方法?如果没有开箱即用的解决方案,人们将如何构建它?这一定是可能的,因为 VisualVM 做到了。

最佳答案

你不需要调试连接,你只需要一个 JMX 连接。但也许这就是你的意思。

回想一下,当您使用适当的选项运行您的应用程序时,例如

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9876
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

(如果您需要安全传输,请替换后两者)您可以使用“添加 JMX 连接”和 servername:9876 从另一台具有 GUI 的计算机连接 JVisualVM作为地址。

详细信息在 http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html 中给出 和 http://visualvm.java.net/jmx_connections.html


当您使用 JVisualVM 连接到本地 JVM 时,唯一的区别是它会检测本地应用程序并告诉它们加载尚未运行的 JMX 代理。

因此您可以编写一个小型本地命令行应用程序在服务器上执行并连接到 JVM 并启动 JMX 代理。 JMX 代理启动后,您可以远程连接 JVisualVMThe program in this answer显示如何执行此操作。

它使用 Attach API定位 JVM 并告诉它加载 JMX 代理并打开 JMX 连接。如果您将使用 JVisualVM 远程打开 JMX 连接,则可以省略第二步。

或者,您可以使用打开的 JMX 连接将此程序扩展为命令行采样工具。 The first example code of this answer给出了如何实现采样器的想法。它对自己的 JVM 进行采样,但由于它使用 ThreadMXBean,您可以轻松地将其更改为适用于远程连接。

关于java - 如何在生产中生成 cpu 快照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142726/

相关文章:

java - 为什么 Java 在 While 循环中跳过我的 If 语句?

java - 如何在 JPA 中创建成对列表作为参数?

java - 从List <List <?转换将Object >>扩展到List <List <SpecificType >>

c++ - 对于一些微积分密集型代码,我怎样才能获得最快的迭代?

python - 提高 Python cProfile 的输出分辨率(需要更高的输出分辨率)

java - Java证书和vba证书有什么区别?

java - 与常规应用程序的测试类冲突

c# - 是否可以直接从 C# 使用 Profiling API?

java - 记录/重放 Java 方法调用的工具

performance - TensorFlow - Titan X 上的 GPU 使用率低