【问题标题】:Is there a way to profile a java application without the use of an external tool?有没有办法在不使用外部工具的情况下分析 Java 应用程序?
【发布时间】:2013-02-13 18:10:29
【问题描述】:

外部工具给我带来了麻烦。有没有办法在不使用一些外部 gui 工具的情况下获得每个函数的简单 cpu 使用/时间?

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

【问题讨论】:

  • 我看不出您有任何没有外部工具的方法。你真的只是在寻找那个,或者只是为那些会做你所要求的而不是 VisualVM 的推荐?
  • @sharakan - 好吧,我会接受什么有效的。我希望有一些“pythonic”,其中main() 是探查器的一个参数,然后它只是执行程序并打印出结果,但如果这样的事情不存在,我愿意接受任何建议工作。
  • 使用 visualvm 插件的可能解决方法:stackoverflow.com/questions/1755819/…

标签: java visualvm


【解决方案1】:

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

-Xrunhprof:cpu=times

有很多选择;有关更多信息,请参阅HPROF 的 Oracle 文档页面。

因此,例如,如果您有一个想要分析的可执行 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 Probes。

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

【讨论】:

  • Arg.. 我不明白。我尝试使用您的建议,以及您链接的父亲的一些建议,它所说的只是Dumping CPU usage by sampling running threads ... done.
猜你喜欢
  • 2020-01-13
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2015-06-16
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多