在命令行中分析正在运行的 Java 应用程序

2022-08-31 16:09:00

我经常使用VisualVM分析运行Java应用程序,但它需要X才能在机器上运行。

我知道我可以通过管理端口进行连接,但这将是一个离线采样分析,这对我来说还不够。

因此,我正在寻找一种解决方案,通过该解决方案,我可以从命令行分析正在运行的Java应用程序的方法的CPU使用情况。对我来说,在服务器上收集数据就足够了,然后可以在另一台计算机上分析收集的数据。

更新:

看来我需要更具体一些。我想从命令行分析正在运行的Java应用程序,我不想停止它并重新运行它。


答案 1

jvmtop 应用程序是一个方便的工具,用于从命令行进行性能分析。无需停止 jvm。用法:

jvmtop.sh --profile <PID>

将为您提供这样的输出,该输出将在应用程序运行时更新:

  Profiling PID 24015: org.apache.catalina.startup.Bootstrap
  36.16% (    57.57s) hudson.model.AbstractBuild.calcChangeSet()
  30.36% (    48.33s) hudson.scm.SubversionChangeLogParser.parse()
   7.14% (    11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript()
  ...

优点是它不需要使用仪器。将要分析的 jvm 的类不会被更改。

如果你正在寻找更直观的东西,那么看看基于jvmtop的jvm-mon


答案 2

看起来从命令行分析java应用程序的“内置”方法是使用分析命令行参数启动它,如下所示

$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...

然后在进程退出后,使用一些GUI工具(或jhat等Web服务器工具)或命令行工具检查文件“myprogram.hprof”(并在那时创建文件)。

如果您使用 https://stackoverflow.com/a/2344436/32453 提到的“QUIT”信号技巧,则可以随意生成文件而无需退出JVM(它似乎附加到以前的输出文件)。或者等到进程退出,它将生成文件。

此(内置)探查器很少执行采样,因此通常总体减速/影响较低。

参考: http://web.archive.org/web/20160623224137/https://thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

你也可以通过收集大量的jstacks并将它们倾倒成ex来做“穷人的分析器”:火焰图或其他一些分析仪/聚集器......


推荐