Java 带有jmap的堆转储抛出NullPointerException

Java 带有jmap的堆转储抛出NullPointerException,java,jvm,jmap,Java,Jvm,Jmap,我试图使用jmap进行堆转储,但我一直得到一个NPE。 我正在使用Oracle的Java7JDK(详细信息如下) 以前有人见过这个吗?谷歌搜索带来了OpenJDK()的问题 但我不确定Oracle JDK是否存在相同的问题。是的,您找到了指向完全相同问题的正确链接。 它已在JDK 7u72中修复 顺便说一句,-F选项使jmap以完全不同的方式工作 不使用-Fjmap使用连接到目标JVM,然后要求JVM在JVM进程内自己生成转储 jmap使用-F挂起目标JVM进程,然后远程读取其内存,在单独的进

我试图使用jmap进行堆转储,但我一直得到一个NPE。 我正在使用Oracle的Java7JDK(详细信息如下)

以前有人见过这个吗?谷歌搜索带来了OpenJDK()的问题
但我不确定Oracle JDK是否存在相同的问题。

是的,您找到了指向完全相同问题的正确链接。
它已在JDK 7u72中修复

顺便说一句,
-F
选项使
jmap
以完全不同的方式工作

  • 不使用
    -F
    jmap使用连接到目标JVM,然后要求JVM在JVM进程内自己生成转储
  • jmap使用
    -F
    挂起目标JVM进程,然后远程读取其内存,在单独的进程中完成所有工作。虽然SA是一个很酷且功能强大的工具,但它并没有很好地维护,无法100%兼容最新的JVM实现细节。因此,遇到SA问题并不罕见

是的,您找到了指向同一问题的正确链接。
它已在JDK 7u72中修复

顺便说一句,
-F
选项使
jmap
以完全不同的方式工作

  • 不使用
    -F
    jmap使用连接到目标JVM,然后要求JVM在JVM进程内自己生成转储
  • jmap使用
    -F
    挂起目标JVM进程,然后远程读取其内存,在单独的进程中完成所有工作。虽然SA是一个很酷且功能强大的工具,但它并没有很好地维护,无法100%兼容最新的JVM实现细节。因此,遇到SA问题并不罕见

您是否必须使用-F进行倾倒?我的经验是,如果可以避免使用-F,Java工具将更加健壮。我不需要-F选项。你必须用-F来倒垃圾吗?我的经验是,如果可以避免使用-F,Java工具将更加健壮。我不需要-F选项。我设法通过:1实现了这一点。删除-F选项。2.以流程所有者的身份运行jmap。3.摆弄创建文件的目录权限(例如chmod o+w/tmp/dumps)。非常感谢!我唯一的问题是:当使用动态附加机制时,假设jvm正在忙着执行GC或被占用(我已经超过了GC阈值),它还会响应堆转储请求吗?在这种情况下,我必须使用“-F”选项吗?@Rajiv是的,动态连接的缺点是,如果JVM忙于长时间运行的GC或其他事情,它可能不会响应
-F
正适合这些情况。否则,动态连接会更快、更可靠。删除-F选项。2.以流程所有者的身份运行jmap。3.摆弄创建文件的目录权限(例如chmod o+w/tmp/dumps)。非常感谢!我唯一的问题是:当使用动态附加机制时,假设jvm正在忙着执行GC或被占用(我已经超过了GC阈值),它还会响应堆转储请求吗?在这种情况下,我必须使用“-F”选项吗?@Rajiv是的,动态连接的缺点是,如果JVM忙于长时间运行的GC或其他事情,它可能不会响应
-F
正适合这些情况。否则,动态连接会更快、更可靠。
$sudo jmap -F -dump:format=b,file=heap.bin 21966

Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Dumping heap to /tmp/dumps/2015-02-18T13:24:36Z-heap.bin ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at sun.tools.jmap.JMap.runTool(JMap.java:197)
  at sun.tools.jmap.JMap.main(JMap.java:128)
Caused by: java.lang.NullPointerException
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeSymbolID(HeapHprofBinWriter.java:905)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeFieldDescriptors(HeapHprofBinWriter.java:743)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClassDumpRecord(HeapHprofBinWriter.java:511)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.access$000(HeapHprofBinWriter.java:297)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter$1.visit(HeapHprofBinWriter.java:446)
  at sun.jvm.hotspot.memory.SystemDictionary$2.visit(SystemDictionary.java:179)
  at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:69)
  at sun.jvm.hotspot.memory.SystemDictionary.classesDo(SystemDictionary.java:190)
  at sun.jvm.hotspot.memory.SystemDictionary.allClassesDo(SystemDictionary.java:183)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClassDumpRecords(HeapHprofBinWriter.java:443)
  at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:413)
  at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:56)
  at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
  at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)


$java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)