RFR: 8230661: ZGC: Stop reloading oops in load barriers
Erik Österlund
erik.osterlund at oracle.com
Mon Oct 28 16:38:02 UTC 2019
Hi,
In ZGC, an oop is first loaded somewhere, by e.g. JIT compiled code.
Then it passes a load barrier that typically does not take a slow path.
But when it does take a slow path, the oop is sometimes reloaded, at
historically three different places, and now two places.
1) We used to do that as part of the mechanism that transferred
execution to the slow path because it was easier to write that stub code
if the original oop died. Since then, the compiler slow paths have been
rewritten to not reload the oop.
2) Once in the slow path, we sometimes reload weak oops during the
resurrection block window, because there used to be a race when it
closed. After concurrent class unloading integrated, there is a
thread-local handshake before closing the resurrection block window.
Therefore, that race no longer exists (when class unloading is used).
3) Once the final oop of a slow path has been determined, self-healing
kicks in. The self-healing CAS may fail. When it does, the oop is
reloaded. But this is completely unnecessary.
With obstacle 1 gone, and 2 and 3 having no reason to be in the code any
more, I propose to get rid of all reloading of the oops in the slow
paths, so that it becomes easier to reason about the code. The object
captured by the original load, is then always the same object as the
object found after the load barrier completes, although possibly with a
new bit representation.
Bug:
https://bugs.openjdk.java.net/browse/JDK-8230661
CR:
https://bugs.openjdk.java.net/browse/JDK-8230661
Thanks,
/Erik
More information about the hotspot-gc-dev
mailing list