有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

调试Java的核心转储等效程序

到目前为止,我已经了解了如何分别使用jstackjmap生成线程转储和堆转储

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

我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量。这种事后调试可以用WinDbg、GDB和核心文件(对于本地C++程序)正常进行。p>

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


共 (4) 个答案

  1. # 1 楼答案

    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秒内创建50个转储),因此可以添加一个类似-Xdump:system:events=fullgc,range=50..55的计数器,它将在第50次到第55次完全垃圾收集之间生成5个内核

  2. # 2 楼答案

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

  3. # 3 楼答案

    我在a{a1}和a{a2}中找到了相关信息:我在这方面运气不太好,但在你的情况下可能有用

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

  4. # 4 楼答案

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