java - 有没有一种方法可以在不使用外部工具的情况下分析 Java 应用程序?

标签 java visualvm

外部工具给我带来了麻烦。有没有一种方法可以在不使用某些外部 GUI 工具的情况下获得简单的 cpu 使用率/每个函数花费的时间?

我一直在尝试使用 VisualVM 分析我的 java 程序,但是我得到了可怕的、令人心碎的、扼杀野心的结果。它只会显示堆使用情况,我感兴趣的是 CPU 使用情况,但该面板只是说此 JVM 不支持。顺便说一句,它并没有告诉我要使用哪个 JVM。我已经下载了 JDK 6 并使用它启动了它,我确保我的程序针对相同的虚拟机,但什么也没有!仍然是相同的、无用的错误消息。 我的需求很简单。我只是想知道该程序把时间花在哪里了。 Python 有一个优秀的内置分析器,可以打印出每个函数所花费的时间,包括每次调用和总时间格式。这确实是我现在正在寻找的范围。大家有什么建议吗?

最佳答案

这并不漂亮,但您可以通过在命令行中添加一个开关来使用内置的 hprof 分析机制。

-Xrunhprof:cpu=times

有很多选项可供选择;请参阅 Oracle 文档页面 HPROF了解更多信息。

因此,例如,如果您有一个想要分析的可执行 jar,您可以输入:

java -Xrunhprof:cpu=times -jar Hello.jar

运行完成后,您将获得一个名为“java.hprof.txt”的(大)文本文件。

该文件将包含一堆有趣的数据,但您要查找的部分是开始的部分:

CPU TIME (ms) BEGIN (total = 500) Wed Feb 27 16:03:18 2013
rank   self  accum   count trace method
   1  8.00%  8.00%    2000 301837 sun.nio.cs.UTF_8$Encoder.encodeArrayLoop
   2  5.40% 13.40%    2000 301863 sun.nio.cs.StreamEncoder.writeBytes
   3  4.20% 17.60%    2000 301844 sun.nio.cs.StreamEncoder.implWrite
   4  3.40% 21.00%    2000 301836 sun.nio.cs.UTF_8.updatePositions

或者,如果您还没有这样做,我会尝试安装 VisualVM-Extensions、VisualGC、Threads Inspector,以及至少 Swing、JVM、Monitor 和 Jvmstat Tracer Probe。

转到工具->插件来安装它们。如果您需要更多详细信息,请发表评论,我将进一步扩展此答案。

关于java - 有没有一种方法可以在不使用外部工具的情况下分析 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120514/

相关文章:

java - 如何打印我的 Java 对象而不得到 "SomeType@2f92e0f4"?

visualvm - OQL 语法来引用一个对象?

java - 获取按类分组的大小为 1 的 ArrayList 引用的对象数

java - 如何在 JSON 中设置参数本地日期

Java多线程——加入一个CPU繁重的线程和volatile关键字

java - 如果我有一个复杂的响应对象,如何使用 JsonIninclude 注释忽略空值

java - 从 ActiveAndroid 切换到 GreenDao

java - Java Visualvm中如何解释大自检结果?

java - 在 visualvm 堆转储中, "Local Variable"之后的线程数是多少?

amazon-ec2 - 如何从 EC2 上的 Spark Streaming 向 VisualVM 报告 JMX?