Unable to create hprof heap dump from core file with jmap on Oracle Solaris
Basil Crow
me at basilcrow.com
Fri Apr 3 17:27:33 UTC 2015
Hi all,
I'm having trouble using jmap(1) to create an hprof heap dump from a
core file on Oracle Solaris with version 8 of the Oracle JDK. This
worked with version 7 of the Oracle JDK:
$ cat Sleep.java
public class Sleep {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(300000);
}
}
$ /opt/jdk1.7.0_76/bin/javac Sleep.java
$ /opt/jdk1.7.0_76/bin/java Sleep &
[1] 1348
$ gcore 1348
gcore: core.1348 dumped
$ jmap -dump:format=b,file=core1348.hprof /opt/jdk1.7.0_76/bin/java \
core.1348
Attaching to core core.1348 from executable /opt/jdk1.7.0_76/bin/java
Debugger attached successfully.
Client compiler detected.
JVM version is 24.76-b04
Dumping heap to core1348.hprof ...
Heap dump file created
This also works with version 8 of the Oracle JDK when lambdas are not
used:
$ /opt/jdk1.8.0_40/bin/javac Sleep.java
$ /opt/jdk1.8.0_40/bin/java Sleep &
[1] 1398
$ gcore 1398
gcore: core.1398 dumped
$ jmap -dump:format=b,file=core1398.hprof /opt/jdk1.8.0_40/bin/java \
core.1398
Attaching to core core.1398 from executable /opt/jdk1.8.0_40/bin/java
Debugger attached successfully.
Server compiler detected.
JVM version is 25.40-b25
Dumping heap to core1398.hprof ...
Heap dump file created
However, this no longer works with version 8 of the Oracle JDK when
lambdas are used:
$ cat LambdaSleep.java
import java.util.Arrays;
public class LambdaSleep {
public static void main(String[] args) throws InterruptedException {
String[] words = new String[] { "longer", "short" };
Arrays.sort(words, (first, second) ->
Integer.compare(first.length(), second.length()));
Thread.sleep(300000);
}
}
$ javac LambdaSleep.java
$ java LambdaSleep &
[1] 1416
$ gcore 1416
gcore: core.1416 dumped
$ jmap -dump:format=b,file=core1416.hprof /opt/jdk1.8.0_40/bin/java \
core.1416
Attaching to core core.1416 from executable /opt/jdk1.8.0_40/bin/java
Debugger attached successfully.
Server compiler detected.
JVM version is 25.40-b25
Dumping heap to core1416.hprof ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.utilities.AssertionFailure: can not get class
data for LambdaSleep$$Lambda$10x0000000100071828
at sun.jvm.hotspot.utilities.Assert.that(Assert.java:32)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeInstance(
HeapHprofBinWriter.java:803)
at sun.jvm.hotspot.utilities.AbstractHeapGraphWriter$1.doObj(
AbstractHeapGraphWriter.java:95)
at sun.jvm.hotspot.oops.ObjectHeap.iterateLiveRegions(
ObjectHeap.java:353)
at sun.jvm.hotspot.oops.ObjectHeap.iterate(ObjectHeap.java:171)
at sun.jvm.hotspot.utilities.AbstractHeapGraphWriter.write(
AbstractHeapGraphWriter.java:51)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(
HeapHprofBinWriter.java:433)
at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:62)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:83)
... 6 more
Note that this problem only occurs when creating an hprof heap dump from
a core file. It doesn't occur when creating an hprof heap dump from a
live process:
$ java LambdaSleep &
[1] 1421
$ jmap -dump:format=b,file=core1421.hprof 1421
Dumping heap to core1421.hprof ...
Heap dump file created
I have reproduced this issue with Java version 1.8.0_40 (JVM version
25.40-b25) on the following platforms:
Oracle Solaris 10 9/10 s10x_u9wos_14a X86
Oracle Solaris 10 8/11 s10s_u10wos_17b SPARC
Oracle Solaris 11.1 X86
Oracle Solaris 11.2 X86
I found a similar issue in the JDK bug system (JDK-8044416), but the
last update there stated that JDK-8044416 "is about the -F
functionality" and to "please file a different bug for problems when
running without -F." I am running without -F, but I haven't been able to
find another bug that tracks the issue described above.
An update would be appreciated, as this bug greatly hampers our ability
to debug memory leaks in production.
Thanks,
Basil
More information about the serviceability-dev
mailing list