Unable to create hprof heap dump from core file with jmap on Oracle Solaris

Dmitry Samersoff dmitry.samersoff at oracle.com
Sun Apr 5 08:01:59 UTC 2015


Basil,

jmap uses SA backend to extract data from coredump and it doesn't
support lambda.

See JDK-8073604

-Dmitry

On 2015-04-03 20:27, Basil Crow wrote:
> 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
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.


More information about the serviceability-dev mailing list