RFR: Fix/improve traversal CLD processing

Aleksey Shipilev shade at redhat.com
Tue Feb 6 20:24:35 UTC 2018


On 02/02/2018 04:42 PM, Roman Kennke wrote:
> In final traversal, we need to process CLDs specially: we need to rescan modified CLDs. If there are
> handles or dependencies added to a CLD during traversal, we would not notice. Normal root scan only
> covers strong roots. But there may be CLD roots that are not strong (let's not call them weak here
> to avoid confusion): CLDs that are only reachable via their ClassLoader Java objects. Any oops held
> by them might not get visited by GC.
> 
> There's a mechanism in CLD to handle this: has_modified_oops(), and we have a special pass to use
> this to rescan CLD roots, however I made a mistake: I never clear that flag. All CLDs will
> eventually have that flag set, which means traversal never unloads any CLDs :-)
> 
> The fix here is to clear the flag in init-traversal, and then check the flag in final-traversal. As
> a bonus I made this piggy-back on normal root scan (including multithreading) by allowing to pass a
> 'weak_cld' to process_strong_roots().
> 
> http://cr.openjdk.java.net/~rkennke/traversal-cld-proc/webrev.00/

OK.

-Aleksey



More information about the shenandoah-dev mailing list