Gan*_*ant 9 java debugging coredump
到目前为止,我已经了解了分别使用jstack和和生成线程转储和堆转储jmap.
但是,jstack线程转储仅包含描述每个线程上的堆栈的文本.使用Java VisualVM打开堆转储(.hprof文件)只显示堆中分配的对象.
我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量.这种事后调试可以通过WinDbg,gdb和核心文件(用于本机C++程序)等工具正常完成.
我想知道Java中是否存在这样的'核心'文件(允许我在非实时环境中调试)?
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届全垃圾收集.