Fix unresolved sticky class GC roots#9497
Conversation
|
In general this makes sense to me. Thank you @wilx. Is there a reason for two commits (other than to see the evolution of the patch?)? I'm not seeing it right now, so I'd suggest to squash the two commits. |
No. I started with just mitigating the NPE and then tried an actual fix. |
Assisted-by: OpenAI GPT-5 Codex
|
Squashed. |
|
not a showstopper but I noticed that the module isn't hooked into CI atm. We should consider to do that first (can be separate PR). We might have to check which tests run reliably and/or are worth running and setup the test config for the module - given that those didn't run in ages. |
Fixes #6357.
ROOT_STICKY_CLASSrecords contain the HPROF object ID of the class object they keep alive. NetBeans already indexesCLASS_DUMPIDs in the heap object map and represents them asClassDumpInstances, so resolvable sticky-class roots can participate in nearest-GC-root and retained-size traversal, including references held in static fields.The remaining problem was in
HprofGCRoots.getGCRoot(Long). When building its object-ID-to-root lookup, it unnecessarily resolved every root throughGCRoot.getInstance()and then recovered the ID from the returnedInstance. Some valid root records in the issue dump refer to loaded-class IDs for which the dump contains no corresponding resolvable heap object.getInstance()therefore returnsnull, and dereferencing it caused the reportedNullPointerException.This change builds the lookup directly from the target object ID stored in each HPROF GC-root record. Resolvable class-object roots continue to be seeded into reachability through the existing
idToOffsetMap, so objects reachable only through their static fields remain reachable. Unresolved root records remain available fromgetGCRoots(), but no synthetic object or references are invented when the dump has no matching heap record.The internal root collection is now typed as
HprofGCRoot, making the raw target-ID invariant compile-time checked rather than relying on a runtime cast. No public API signatures change.The synthetic HPROF test support now writes static object fields and either resolved or unresolved sticky-class root IDs. Regression coverage verifies both that:
ClassDumpInstance, is found by GC-root lookup, and retains an object referenced only by a static field;Validation performed:
getBiggestObjectsByRetainedSize(15)completes successfully on the issue dump.HeapSegmentTest: 4 tests passed.profiler/lib.profilerunit suite with the module access required by its legacy CPU tests: 70 tests ran, 68 passed, and 2 failed.testHeapDumpLoggolden-file comparisons inHeapTestandHeapFromBufferTest; they contain the same JVM system properties in a different iteration order on this JDK and are unrelated to the GC-root change.Assisted-by: OpenAI GPT-5 Codex
^Add meaningful description above
Click to collapse/expand PR instructions
By opening a pull request you confirm that, unless explicitly stated otherwise, the changes -
LLMs, Commit messages and PR description:
git log) that all commits have a valid name and email address for you in the Author field.Assisted-by: MODEL_NAME MODEL_VERSIONline appended to the commit message.Assisted-byline from above)If you're a first time contributor, see the Contributing guidelines for more information.
If you're a committer, please label the PR before pressing "Create pull request" so that the right test jobs can run.
PR approval and merge checklist:
If this PR targets the delivery branch: don't merge. (full wiki article)