RFR: 8215754: ZGC: nmethod is not unlinked from Method before rendezvous handshake

Erik Österlund erik.osterlund at oracle.com
Wed Jan 9 15:51:00 UTC 2019


During concurrent class unloading in ZGC, the nmethod unloading goes 
through 3 phases:

1) Unlink all references to nmethods
2) Rendezvous handshake, to make sure all JavaThreads are in the new 
epoch where unlinking is done
3) Purge nmethods (by making them unloaded).

However, we unfortunately unliked the code from the Method to the 
nmethod during #3 inside of the nmethod entry barrier instead of #1, 
causing JavaThreads to still observe these nmethods during phase #3, 
racing with make_unloaded(), and causing crashes in the nmethod entry 

The fix for this is to unlink the nmethod from the method during the 
first phase. I additionally eagerly unlink it in the nmethod barrier, to 
allow calls into unloading nmethods to not get stuck until the GC comes 
around to do it.




More information about the hotspot-gc-dev mailing list