RFR: 8234426: Sweeper should not CompiledIC::set_to_clean with ICStubs for is_unloading() nmethods

erik.osterlund at oracle.com erik.osterlund at oracle.com
Fri Nov 22 10:49:11 UTC 2019


Hi,

When the sweeper processes an nmethod, it will clean inline caches if it 
is_alive().
Today, the cleaning will utilize transitional states (using ICStubs) if 
the nmethod is_alive(),
which is always true for the sweeper. If it runs out of ICStubs, it 
might have to safepoint
to refill them. When it does, the currently processed nmethod might be 
is_unloading().
That is not a problem for the GC per se (safepoint operation fusing with 
mark end), but it
is a problem for heap walkers that get confused that an nmethod 
reachable from a thread is unloading
and hence has dead oops in it. This sweeper nmethod is the *only* 
nmethod that violates an
invariant that nmethods reachable from threads (Thread::nmethods_do) are 
not unloading.

By simply changing the condition to not use ICStubs when the nmethod 
is_unloading(), we
get this neat invariant, and code gets less confused about this.

Bug:
https://bugs.openjdk.java.net/browse/JDK-8234426

Webrev:
http://cr.openjdk.java.net/~eosterlund/8234426/webrev.00/

Thanks,
/Erik


More information about the hotspot-dev mailing list