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

KAR*_*ván 54 java performance command-line profiling jvm

我经常使用VisualVM运行Java应用程序,但需要X才能在计算机上运行

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

所以我正在寻找一种解决方案,我可以从命令行分析正在运行的Java应用程序的方法的CPU使用情况.这对我来说足以在服务器上收集数据,然后可以在不同的机器上分析收集的数据.

更新:

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

And*_*ejs 30

jvmtop应用程序是从命令行配置的是方便的工具.没必要停止jvm.用法:

jvmtop.sh --profile <PID>
Run Code Online (Sandbox Code Playgroud)

会给你这样的输出,它将在应用运行时更新:

  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()
  ...
Run Code Online (Sandbox Code Playgroud)

优点是它不需要使用仪器.待定形的jvm的类不会被改变.

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

  • 多年来,我一直在捣乱并诅咒visualvm.谢谢你指点我这个方便的工具.没有JVM代理,服务器重启等工作.只需在要分析的框中解压缩,将JAVA_HOME指向正确的位置并运行. (4认同)
  • 这是一个很好的工具,但是项目看起来已经死了。自2015年以来没有发布 (2认同)
  • 从 JDK 9 开始,jvmtop 似乎不再工作了。 (2认同)

Mik*_*vey 14

你能用jstack收集10或20个堆栈样本吗?然后,如果Foo是一种方法,它的总时间使用是包含它的样本的分数.其CPU使用率是那些不在I/O或系统调用中终止的样本的一部分.它的"自我时间"是它本身就是终点的样本的一部分.

我不需要任何漂亮的东西.我要么在IDE下运行它并以这种方式收集它们,要么使用jstack之类的东西来快照正在运行的应用程序的堆栈.

这是随机暂停技术.


rog*_*ack 13

看起来从命令行配置java应用程序的"内置"方法是使用profiling命令行参数启动它,就像这样

$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
Run Code Online (Sandbox Code Playgroud)

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

如果您使用"QUIT"信号技巧,提到/sf/answers/164110551/,那么您可以随意生成文件而无需退出JVM(它似乎附加到上一个输出文件).或者等到进程退出并生成文件.

这个(内置)分析器不经常进行样本,因此整体上通常具有较低的减速/冲击.

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

  • 谢谢指点!未来读者请注意:hprof 正在对处于 Java RUNNABLE 状态的线程进行采样(因此它并不像我预期的那样聚合多个 `jstack` 转储,但它也不会测量 CPU 消耗)。它还有其他问题 - 请参阅 http://www.brendangregg.com/blog/2014-06-09/java-cpu-sampling-using-hprof.html (3认同)

San*_*rma 6

我们已经在我们的服务器上使用了hprof,它肯定比sysouts更好,以防你无法运行完整的VisualVM会话.

使用hprof的例子很多:


Vad*_*zim 5

使用https://github.com/jvm-profiling-tools/async-profiler可以实现最精确的分析。

这个项目是一个低开销的 Java 采样分析器,不受安全点偏差问题的影响。它具有特定于 HotSpot 的 API 来收集堆栈跟踪和跟踪内存分配。分析器与 OpenJDK、Oracle JDK 和其他基于 HotSpot JVM 的 Java 运行时一起工作。

这是我从命令行安装和运行它的脚本:

异步分析器.sh

if [ ! -d profiler ]; then
  mkdir profiler && cd profiler && curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6-ea/async-profiler-1.6-ea-linux-x64.tar.gz | tar xvz
  echo 1 > /proc/sys/kernel/perf_event_paranoid
  echo 0 > /proc/sys/kernel/kptr_restrict
  #apt install openjdk-8-dbg
else
  cd profiler
fi

#jps

./profiler.sh -d 60 -f dump_`date +%Y-%m-%d_%H-%M-%S`.jfr `jps -q`
Run Code Online (Sandbox Code Playgroud)

它假设应用程序在同一用户下运行,并且 jps 会列出一个 java 进程 PID。分析持续时间为 60 秒。

无需修改应用程序的启动选项或重启应用程序。

用于检查转储的 GUI 内置于 IntelliJ IDEA Ultimate:https : //www.jetbrains.com/help/idea/cpu-profiler.html