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

Roman Kennke rkennke at redhat.com
Fri Nov 22 12:03:01 UTC 2019

We also see a problem that might be related to this with Shenandoah.
I'll test your change and see if it resolves that problem.


> 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