-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8357782: JVM JIT Causes Static Initialization Order Issue #25725
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
👋 Welcome back mhaessig! A progress list of the required criteria for merging this PR into |
@mhaessig This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 95 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. As you do not have Committer status in this project an existing Committer must agree to sponsor your change. Possible candidates are the reviewers of this PR (@dafedafe, @TobiHartmann, @dean-long) but any other Committer may sponsor as well. ➡️ To flag this PR as ready for integration with the above commit message, type |
/contributor add @TobiHartmann |
@mhaessig |
Webrevs
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for fixing this @mhaessig!
Looks good to me!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me.
Co-authored-by: Dean Long <[email protected]>
Thank you for your reviews! /integrate |
/sponsor |
Going to push as commit e8ef93a.
Your commit was automatically rebased without conflicts. |
@TobiHartmann @mhaessig Pushed as commit e8ef93a. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
Issue Summary
When C1 compiles a method that allocates a new instance of a class that is not fully initialized at compile time, it does not take into account that the
<clinit>
might run a static initializer that might have side effects. Consider the following example:Here,
B.field
gets assigned inC
's static initializer. Since C1 believes that thenewinstance
does not have memory side effects, local value numbering eliminates the field access for the argument inC.<init>
because it believes thatB.field
is still the same astmp
. Hence, the assignment inC.<clinit>
gets effectively ignored and the code triggers the runtime exception. Because this only happens ifC
is not fully initialized when it is compiled, we need-Xcomp
to reproduce this issue.Changes
To fix the illustrated issue, this PR ensures that
newinstance
kills the memory state in C1's LVN if the class might not be fully initialized. Since we can not reliably detect if a class has a static initializer, we kill memory whenever a class is not yet loaded or, if it has already been loaded, when it has not been fully initialized, which is conservative and might kill memory when it is not necessary for correctness and have an impact on performance in the form of some additional field accesses.Benchmark Results
Since this might have an effect on startup, I ran some benchmarks. The results mostly did not show effects outside the run-to-run variance.
Testing
Acknowledgements
Shout out to @TobiHartmann who wrote the reproducer that became the regression test and helped me find my way around C1 and narrow down the problem.
Progress
Issue
Reviewers
Contributors
<[email protected]>
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/25725/head:pull/25725
$ git checkout pull/25725
Update a local copy of the PR:
$ git checkout pull/25725
$ git pull https://git.openjdk.org/jdk.git pull/25725/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 25725
View PR using the GUI difftool:
$ git pr show -t 25725
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/25725.diff
Using Webrev
Link to Webrev Comment