13

只是想知道有哪些工具和技术可以调试 Java 应用程序的生产问题。喜欢,

  • 线程转储的方法和工具是什么?
  • 进行堆转储的方法和工具是什么?
  • 分析上述转储的工具有哪些?

(假设都在 Linux/Unix 环境下)

4

7 回答 7

7

线程转储的方法和工具是什么?

对于线程转储,您可以使用 JConsole、VisualVM,或者更简单地说,向目标进程发送 QUIT 信号

kill -QUIT <pid> 

或者

kill -3 <pid>

从 Java 5 开始,还有jstack一个独立于平台的,并且有一个很好的-m选项来打印 Java 和本机框架(混合模式)。

进行堆转储的方法和工具是什么?

使用 Sun VM、、jmapSun JConsole、Sun VisualVM、SAP JVMMon。对于 IBM VM,请查看此页面。实际上,Eclipse MAT wiki 有一个很好的Getting a Heap Dump部分总结了所有选项。

分析上述转储的工具有哪些?

对于线程转储,我使用TDA - Thread Dump Analyzer(用于 Sun JDK)和IBM Thread and Monitor Dump Analyzer(用于 IBM JDK)。Samurai也非常好(它像 a 一样工作tail -f并自动从您的 std/stderr 拾取线程转储,它还可以读取“-verbose:gc”日志)并且已经针对来自 Apple、BEA、HP、Sun 和 IBM 的 VM 进行了测试(也可以阅读IBM的javacore)。

对于堆转储,我根据需要使用VisualVM(用于 Sun JDK)或IBM Heap Dump Analyzer(仅用于 IBM JDK)或超棒的Eclipse MAT。后者能够处理来自各种 IBM 平台的 HPROF 二进制堆转储(由 Sun、HP、SAP 等 JVM 生成)、IBM 系统转储(在对其进行预处理之后)和 IBM 可移植堆转储 (PHD) )。

于 2010-05-28T19:28:53.937 回答
1

JVM 没有标准工具集。这些取决于供应商,您应该查阅文档。

对于 Sun Java 6,VisualVM 程序对于快速获取正在运行的程序的配置文件和堆栈跟踪非常非常有帮助。

于 2010-05-28T18:29:33.507 回答
1

假设 JDK 6,请查看以下文章以获取正在运行的程序的线程转储:

http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/

您可以使用 JHat 进行堆分析:

http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html

如果您想做内存转储,请查看 jmap:

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

或者,如果您需要进行更深入的分析,请查看 Yourkit 之类的分析器:

http://www.yourkit.com/

于 2010-05-28T18:08:38.627 回答
1

还有两件事会让你感兴趣:

于 2010-05-28T18:11:43.720 回答
1

我用于调试 Sun JVM 的工具是

  • jstack进行线程转储
  • jmap进行内存/堆转储或直方图
  • eclipse mat,用于对 jmap 生成的堆转储进行后期分析
  • visual vm有一个很好的 ui 用于实时分析 vm(也可以进行堆和线程转储)
于 2010-05-30T02:24:33.337 回答
0

要调试内存分配问题,可以在命令行中使用InMemProfiler 。可以跟踪实时与收集的分配,并且可以根据其生命周期将收集的对象拆分为存储桶。

在跟踪模式下,该工具可用于识别内存分配的来源

于 2010-08-29T19:15:04.580 回答
0

而且我认为在生产环境中调试java应用程序的最佳方法不是转储等,而是良好的日志管理。

参见例如slf4j

于 2010-05-28T18:24:40.650 回答