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