2010-05-28 52 views
13

想知道什么是各种工具&用于调试Java应用程序的生产问题。 赞,可用于调试生产的工具Java应用程序中的问题

  • 什么是采取线程转储的方式和工具?
  • 采取堆转储的方式和工具是什么?
  • 什么是分析上述转储的工具?

(假设所有的都在的Linux/Unix环境)

+1

我编辑了你的文章,因为我相当确定你对内存_dumps_,而不是内存_dumbs_ ;-) – 2010-05-28 18:06:06

+1

你对内存转储和堆转储有什么区别? – 2010-05-28 19:39:53

+0

谢谢大家,指出所有的错字..我纠正了我的问题。 – 2010-05-31 01:13:38

回答

7

什么是采取线程转储的方式和工具?

对于一个线程转储,您可以使用JConsole的,VisualVM的,或者更简单地说,发出退出信号目标进程

kill -QUIT <pid> 

kill -3 <pid> 

由于Java 5,也是jstack这是独立于平台,并有一个很好的-m选项来打印Java和本机帧(混合模式)。

采取堆转储的方式和工具是什么?

在Sun的虚拟机,jmap,孙JConsole,孙VisualVM,SAP JVMMon。对于IBM VM,请检查this page。实际上,Eclipse MAT wiki有一个不错的Getting a Heap Dump部分,总结了所有选项。

什么是分析上述转储的工具?

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

对于堆转储,我使用VisualVM(对于Sun JDK)或IBM Heap Dump Analyzer(仅适用于IBM JDK)或根据我的需要使用的极好的Eclipse MAT。后者是,能够与HPROF二进制堆转储(由Sun,HP,SAP等生成的JVM),IBM系统转储(对它们进行预处理之后)以及来自各种IBM的IBM便携式堆转储(PHD)平台)。

+0

谢谢!我会通过这些链接获取更多信息... – 2010-05-31 01:14:16

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/

-1

而且我认为在生产环境中调试Java应用程序的最佳方式不是倾倒等,但日志良好的同治。

参见例如slf4j

+0

咦?线程转储和堆转储非常有价值,并且尽管日志也非常有用,但当您获得此OOM时,它们不会告诉您线程(包括服务器之一)在做什么或内存中有什么。只能使用日志进行严重的问题分析(尤其是如果您指的是应用程序日志)。 – 2010-05-28 19:37:20

+0

日志主要用于获取有关您以后会问的问题的答案。那么,那些你没有想到的问题呢? – 2010-05-31 03:56:00

1

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

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

1

我用这种调试的Sun JVM的工具是

  • jstack采取线程转储
  • jmap采取的内存/堆转储,或直方图
  • eclipse mat为岗位通过JMAP
  • visual vm产生的堆转储的分析对虚拟机进行实时分析一个很好的用户界面(也可乘坐堆和线程转储)
相关问题