Java 如何在生产中生成cpu快照?

Java 如何在生产中生成cpu快照?,java,profiling,Java,Profiling,使用VisualVM,我可以连接到本地java进程,启动/停止CPU评测,并生成快照。我甚至不需要用任何特务等来指导这个过程 是否可以在无头生产服务器上执行相同的操作?我知道我可以将进程配置为远程连接调试器,但我希望将更改客户环境的数量和影响降至最低。我只想运行一个命令来分析一段时间,并生成一个快照文件,我可以将其scp到我的工作站,以便使用VisualVM或等效工具进行分析 最好是,我运行的任何程序都可以自由地重新发布,这样我就可以将它与Java应用程序捆绑在一起,并在客户环境中使用它 理想情

使用VisualVM,我可以连接到本地java进程,启动/停止CPU评测,并生成快照。我甚至不需要用任何特务等来指导这个过程

是否可以在无头生产服务器上执行相同的操作?我知道我可以将进程配置为远程连接调试器,但我希望将更改客户环境的数量和影响降至最低。我只想运行一个命令来分析一段时间,并生成一个快照文件,我可以将其scp到我的工作站,以便使用VisualVM或等效工具进行分析

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

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

到目前为止,我发现的最接近的方法是:

但这需要重新启动以开始评测,并停止另一次评测,因为我看不到在运行时打开和关闭采样的方法


有更好的办法吗?如果没有现成的解决方案,人们将如何构建它?这一定是可能的,因为VisualVM做到了这一点。

您曾经尝试过您的工具包java profiler吗? 它对性能有很多好处 但它也显示cpu使用率和

您可以使用它来快照cpu并在生产中显示它 从以下链接,您可以找到文档并下载:


您不需要调试连接,只需要一个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

详情载于 及


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

因此,您可以编写一个小型的本地命令行应用程序,在服务器上执行,并连接到JVM并启动JMX代理。一旦JMX代理启动,您就可以远程连接
JVisualVM
。演示如何执行此操作

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


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

我认为这并不能回答我的问题。我想知道如何在无头环境中捕获CPU快照。YourKit有命令行模式吗?我会回答,因为这个问题是关于YourKit profiler的。是的,YouKit有命令行工具来控制评测—您不需要使用工具包GUI来启动/停止评测和捕获快照。而且您不需要GUI来集成JavaEE服务器和探查器代理。有一个命令行JavaEE集成向导yourkit的最大问题是它们的许可。YourKit可以在提供捕获配置的独立代理模式下运行,但由于该环境是另一个不拥有YourKit许可证的客户的产品,您是否可以在该环境中使用YourKit代理生成分析快照(即代理是否无许可证,YourKit GUI是否在许可证下)?若代理处于许可证之下,那个么yourkit对于分析远程客户应用程序(其中需要无头模式)是无用的。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9876
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false