只是想知道有哪些工具和技术可以调试 Java 应用程序的生产问题。喜欢,
- 线程转储的方法和工具是什么?
- 进行堆转储的方法和工具是什么?
- 分析上述转储的工具有哪些?
(假设都在 Linux/Unix 环境下)
只是想知道有哪些工具和技术可以调试 Java 应用程序的生产问题。喜欢,
(假设都在 Linux/Unix 环境下)
线程转储的方法和工具是什么?
对于线程转储,您可以使用 JConsole、VisualVM,或者更简单地说,向目标进程发送 QUIT 信号
kill -QUIT <pid>
或者
kill -3 <pid>
从 Java 5 开始,还有jstack
一个独立于平台的,并且有一个很好的-m
选项来打印 Java 和本机框架(混合模式)。
进行堆转储的方法和工具是什么?
使用 Sun VM、、jmap
Sun 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) )。
JVM 没有标准工具集。这些取决于供应商,您应该查阅文档。
对于 Sun Java 6,VisualVM 程序对于快速获取正在运行的程序的配置文件和堆栈跟踪非常非常有帮助。
假设 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 之类的分析器:
还有两件事会让你感兴趣:
我用于调试 Sun JVM 的工具是
要调试内存分配问题,可以在命令行中使用InMemProfiler 。可以跟踪实时与收集的分配,并且可以根据其生命周期将收集的对象拆分为存储桶。
在跟踪模式下,该工具可用于识别内存分配的来源。
而且我认为在生产环境中调试java应用程序的最佳方法不是转储等,而是良好的日志管理。
参见例如slf4j。