Java的核心转储等价

Gan*_*ant 9 java debugging coredump

到目前为止,我已经了解了分别使用jstack和和生成线程转储和堆转储jmap.

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

我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量.这种事后调试可以通过WinDbg,gdb和核心文件(用于本机C++程序)等工具正常完成.

我想知道Java中是否存在这样的'核心'文件(允许我在非实时环境中调试)?

vmh*_*ker 5

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

您还可以在java命令行中添加-Xdump:system或者-Xdump:heap等等来过滤事件并在VM Stop(-Xdump:system:events=vmstop),完全垃圾收集(-Xdump:system:events=fullgc)等特定事件上生成转储.注意,根据您的堆大小,在完整GC上生成转储是可能不是一个好主意(也就是说,如果你堆增长从4M到在20秒左右60M可以创建50个转储withing 20秒),所以你可以添加一个计数器喜欢-Xdump:system:events=fullgc,range=50..55这将产生50间5个内核第55届全垃圾收集.


Tom*_*vic 2

我在Sun 论坛和 SO讨论中找到了相关信息:我对此运气不佳,但它可能适用于您的情况。

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