I tried to parse the heap dump generated by `jhsdb jmap`, but it couldn't with 
following error on MAT. This exception happens since JDK 28. It does not happen 
on JDK 27 EA and 26 at least.


java.lang.NullPointerException
        at 
java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at 
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at 
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
        at 
java.base/java.util.concurrent.ForkJoinTask.getException(ForkJoinTask.java:564)
        at 
java.base/java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:580)
        at 
java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1022)
        at 
org.eclipse.mat.parser.internal.GarbageCleaner.createHistogramOfUnreachableObjects(GarbageCleaner.java:592)
        at 
org.eclipse.mat.parser.internal.GarbageCleaner.clean(GarbageCleaner.java:170)
        at 
org.eclipse.mat.parser.internal.SnapshotFactoryImpl.parse(SnapshotFactoryImpl.java:505)
        at 
org.eclipse.mat.parser.internal.SnapshotFactoryImpl.openSnapshot(SnapshotFactoryImpl.java:244)
        at 
org.eclipse.mat.snapshot.SnapshotFactory.openSnapshot(SnapshotFactory.java:149)
        at 
org.eclipse.mat.ui.snapshot.ParseHeapDumpJob.run(ParseHeapDumpJob.java:99)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.lang.NullPointerException: Cannot invoke 
"org.eclipse.mat.parser.model.ClassImpl.getName()" because "r.clazz" is null
        at 
org.eclipse.mat.parser.internal.GarbageCleaner$CreateHistogramOfUnreachableObjectsChunk.call(GarbageCleaner.java:683)
        at 
org.eclipse.mat.parser.internal.GarbageCleaner$CreateHistogramOfUnreachableObjectsChunk.call(GarbageCleaner.java:1)
        at 
java.base/java.util.concurrent.ForkJoinTask$AdaptedInterruptibleCallable.compute(ForkJoinTask.java:1718)
        at 
java.base/java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1662)
        at 
java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:511)
        at 
java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1450)
        at 
java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2019)
        at 
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)


[JDK-8389219](https://bugs.openjdk.org/browse/JDK-8389219) introduced following 
code in heapDumper.cpp in HotSpot. The error has been gone when I imported it 
into SA.


  // Direct instances of ObjArrayKlass represent the Java types that Java code 
can see.
  // RefArrayKlass/FlatArrayKlass describe different implementations of the 
arrays, filter them out to avoid duplicates.
  static bool filter_out_klass(Klass* k) {
    if (k->is_objArray_klass() && k->kind() != 
Klass::KlassKind::ObjArrayKlassKind) {
      return true;
    }
    return false;
  }


This PR introduces that code in SA, and tests class ID duplication.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Avoid class duplication in heapdump on SA

Changes: https://git.openjdk.org/jdk/pull/32386/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32386&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8390442
  Stats: 118 lines in 4 files changed: 114 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/32386.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/32386/head:pull/32386

PR: https://git.openjdk.org/jdk/pull/32386

Reply via email to