Fix unresolved sticky class GC roots#9497
Open
wilx wants to merge 2 commits into
Open
Conversation
Assisted-by: OpenAI GPT-5 Codex
Assisted-by: OpenAI GPT-5 Codex
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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)