Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在命令行中评测正在运行的Java应用程序_Java_Performance_Command Line_Jvm_Profiling - Fatal编程技术网

在命令行中评测正在运行的Java应用程序

在命令行中评测正在运行的Java应用程序,java,performance,command-line,jvm,profiling,Java,Performance,Command Line,Jvm,Profiling,我经常使用VisualVM评测运行Java应用程序,但它需要X才能在机器上运行 我知道我可以通过管理端口连接,但这将是一个离线采样分析,这对我来说是不够的 因此,我正在寻找一种解决方案,通过该解决方案,我可以从命令行分析正在运行的Java应用程序的方法的CPU使用情况。对我来说,在服务器上收集数据就足够了,然后可以在不同的机器上分析收集到的数据 更新: 看来我需要更具体一点。我想从命令行评测一个正在运行的Java应用程序,我不想停止它并重新运行它。我们已经在服务器上使用过,如果您不能运行完整的V

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

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

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

更新:

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

我们已经在服务器上使用过,如果您不能运行完整的VisualVM会话,它肯定比sysouts好

使用hprof的例子很多:


您可以远程运行大多数商业探查器,以便在服务器上运行代理,然后通过开发人员机器上的客户端连接到该代理。我最喜欢的剖析器是JProfiler。这是相当合理的购买,而且非常稳定(并非所有的商业剖析器都是如此)

其他稳定但不是我最喜欢的商业分析器是YourKIT


那些小供应商是很好的工具。这些工具将为您提供大量有关方法计时、内存使用、GC等的信息,比jconsole多得多。

您能用jstack收集10或20个堆栈样本吗?如果Foo是一种方法,那么它的总时间使用率就是包含它的样本的分数。它的CPU使用率是那些不以I/O或系统调用终止的样本的分数。它的“自我时间”是它自身作为终点的样本的分数

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

这就是技术。

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

$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
然后使用一些GUI工具(或类似web服务器的工具)检查文件“myprogram.hprof”,或者在进程退出之后(此时创建了该文件)

如果您使用前面提到的“退出”信号技巧,那么您可以随意生成一个文件,而无需退出JVM(它似乎附加到前面的输出文件)。或者等待进程退出并生成文件

此(内置)探查器不经常进行采样,因此总体上通常具有较低的减速/影响

参考:

您也可以通过收集大量JSTACK并将其转储到ex:a或其他analyzer/conglomerator中来完成“可怜的人的剖析器”…

该应用程序是一个方便的工具,可以从命令行进行剖析。不需要停止jvm。用法:

jvmtop.sh --profile <PID>
优点是它不使用仪器。要分析的jvm的类将不会更改

如果您正在寻找更直观的东西,那么可以看看哪个是基于jvmtop的。分析“已经启动”的JVM的一种方法是聚合一段时间内使用的多个JSTACK


例如,您可以解析它们并将其显示为(请参见该链接的各种答案中的详细信息,我不会在此处重复包含它们)。

可以通过以下方法实现最精确的分析

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

以下是我要从命令行安装和运行它的脚本:

async profiler.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`
它假设应用程序在同一个用户下运行,并且jps将列出一个java进程PID。 分析持续时间为60秒

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


用于检查转储的GUI内置于IntelliJ IDEA Ultimate:。

但我真的不知道如何将其附加到PID。抱歉,
hprof
不允许附加到进程。最好的办法是研究像jprofile和jtop这样的工具@SanjayT.Sharma我正在使用HPROF进行CPU评测,使用CPU=times,并在应用程序每次特定运行后生成数据,但我无法分析数据,例如特定运行的哪个进程的CPU使用率最高。使用jhat没有多大帮助,请启发。@blong:Good spot,修复了断开的链接。@SanjayT.Sharma,太好了,非常感谢!向下投票转换为向上投票:)你能用jstack收集10或20个堆栈样本吗?如果Foo是一种方法,那么它的总时间使用率就是包含它的样本的分数。它的CPU使用率是那些不以I/O或系统调用终止的样本的分数。它的“自我时间”是它自身作为终点的样本的分数。这与VisualVM离线评测是一样的,不是吗?它不会按行(非函数)告诉您该行负责的包含时间(非独占)的百分比,以及总时间(不仅仅是CPU)。它遭受着痛苦。堆栈采样并不漂亮,但它很快就会发现性能问题。其他工具很漂亮,它们给了你很多数字让你费解,但它们不能直接解决问题,不管是什么。我试图获取堆栈跟踪,但它拒绝在没有
-F
标志的情况下运行,因为它会冻结我的应用程序。嘿,我不需要任何漂亮的东西。我要么在IDE下运行它并以这种方式收集它们,要么使用jstack之类的东西来快照正在运行的应用程序的堆栈。我选择了这个想法:这个解决方案帮助我找到了服务器上DNS解析的瓶颈。再次感谢你@KARASZI István:很高兴它起到了作用。多年来我一直在搞乱witth和诅咒visualvm。感谢
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`