Java的核心转储等价

问题描述:

到目前为止,我已经了解到分别使用jstackjmap生成线程转储和堆转储。Java的核心转储等价

但是,jstack线程转储只包含描述每个线程上的堆栈的文本。使用Java VisualVM打开堆转储(.hprof文件)只会显示在堆中分配的对象。

我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量。这种验尸调试可以使用WinDbg,gdb和核心文件(用于本地C++程序)来正常完成。

我在想这样的'核心'文件(这将允许我在非调试Java环境中存在吗?

我在Sun forum和SO discussion中发现了相关信息:我没有太多运气,但它可能适用于您的情况。

注意:所提及的一些工具是Java工具,但不受支持,并且在Windows版本的JDK上不可用。

+0

谢谢。我认为'jsadebugd'非常接近我要找的东西。 – Gant 2010-03-20 13:02:20

我不认为标准Java中存在这样的转储机制。

Java的确如此。如果您正在使用IBM VM,请使用com.ibm.jvm.Dump.SystemDump()以编程方式生成转储。这可以使用调试器进行调试。我相信“杀死”你的Java进程应该也会产生一个系统转储。对于Unix,使用kill -4 pid,其中pid是进程ID,如果您有1个VM实例正在运行,可以通过键入top | grep java来查询。

您还可以添加-Xdump:system-Xdump:heap等你的java命令行来过滤事件并产生像VM停止某些事件(-Xdump:system:events=vmstop),全垃圾收集转储(-Xdump:system:events=fullgc)等。注意,根据您的堆大小,在完整的GC上生成转储可能不是一个好主意(也就是说,如果您在20秒内从4M增长到60M左右,则可以创建20个20秒的转储),因此您可以添加一个像-Xdump:system:events=fullgc,range=50..55这样的计数器,这会生成5个核心在50到55之间全面垃圾收集。

某些操作系统(例如Linux上的Solaris mdb或gdb)支持在转储文件上使用普通的本机调试程序,并为显示Java堆栈帧提供了一些特殊支持。但是这很硬,可能不是你想要的,因为它没有很好地与Java调试器集成在一起。