Java的核心转储相当于什么?

11
到目前为止,我已经学会了使用jstackjmap生成线程转储和堆转储。然而,jstack线程转储仅包含描述每个线程上堆栈的文本。而使用Java VisualVM打开堆转储(.hprof文件)只显示在堆中分配的对象。
我实际上想要的是能够查看堆栈,切换到特定的堆栈帧,并监视局部变量。这种事后调试通常可以使用像WinDbg、gdb和core文件(用于本地C++程序)这样的工具完成。
我想知道在Java中是否存在这样的“core”文件(它允许我在非实时环境下进行调试)?
4个回答

6

Java可以生成系统转储。如果您使用的是IBM虚拟机,请使用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个以上的转储),因此您可以添加一个计数器,例如-Xdump:system:events=fullgc,range=50..55,这将在第50到55次完全垃圾收集之间生成5个核心转储。


2

我在Sun论坛和一个SO的讨论中找到了相关信息:我没有太多好运,但它可能适用于你的情况。

注意:其中一些工具是Java工具,但是不受支持并且不可用于JDK的Windows版本。


谢谢。我认为jsadebugd非常接近我想要的。 - Gant

1

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


1

一些操作系统(例如Solaris mdb或Linux上的gdb)支持在转储文件上使用普通本地调试器,并提供一些特殊支持以显示Java堆栈帧。但这相当专业,可能不是您想要的,因为它与Java调试器集成不良。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接