Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java的核心转储等价物_Java_Debugging_Coredump - Fatal编程技术网

Java的核心转储等价物

Java的核心转储等价物,java,debugging,coredump,Java,Debugging,Coredump,到目前为止,我已经了解了如何分别使用jstack和jmap生成线程转储和堆转储 但是,jstackthread dump只包含描述每个线程上堆栈的文本。使用Java VisualVM打开堆转储(.hprof文件)只显示堆中分配的对象 我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量。这种事后调试可以用WinDbg、GDB和核心文件(对于本地C++程序)正常执行。 我想知道Java中是否存在这样的“核心”文件(这将允许我在非实时环境中进行调试)?我认为标准Java中不存在这样的转储机

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

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

我真正想要的是能够看到堆栈,切换到特定的堆栈帧,并观察局部变量。这种事后调试可以用WinDbg、GDB和核心文件(对于本地C++程序)正常执行。
我想知道Java中是否存在这样的“核心”文件(这将允许我在非实时环境中进行调试)?

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

我在a和a SO中找到了相关信息:我对它运气不太好,但它在您的情况下可能会起作用


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

Java提供。如果您使用的是IBM VM,请使用
com.IBM.jvm.Dump.SystemDump()
以编程方式生成转储。这可以使用调试器进行调试。我相信“杀死”Java进程也会生成一个系统转储。对于Unix,请使用
kill-4PID
,其中pid是进程id,如果有一个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个内核。

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

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