8373096: JFR leak profiler: path-to-gc-roots search should be non-recursive #28659
+53
−30
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.
A customer reported a crash when producing a JFR recording with
path-to-gc-roots=true. It was a native stack overflow that occurred during the recursive path-to-gc-root search performed in the context of PathToGcRootsOperation.We try to avoid this by limiting the maximum search depth (DFSClosure::max_dfs_depth). That solution is brittle, however, since recursion depth is not a good proxy for thread stack usage: it depends on many factors, e.g., compiler inlining decisions and platform specifics. In this case, the VMThread's stack was too small.
This RFE changes the algorithm to be non-recursive.
Note that as a result of this change, the order in which oop maps are walked per oop is reversed : last oops are processed first. That should not matter for the end result, however. The search is still depth-first.
Note that after this patch, we could easily remove the max_depth limitation altogether. I left it in however since this was not the scope of this RFE.
Testing:
Progress
Issue
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/28659/head:pull/28659$ git checkout pull/28659Update a local copy of the PR:
$ git checkout pull/28659$ git pull https://git.openjdk.org/jdk.git pull/28659/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 28659View PR using the GUI difftool:
$ git pr show -t 28659Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/28659.diff
Using Webrev
Link to Webrev Comment