Review Request (M) 8032379: Remove the is_scavenging flag to process_strong_roots

Jon Masamitsu jon.masamitsu at oracle.com
Wed Jan 22 21:44:16 UTC 2014


On 1/22/2014 8:45 AM, Mikael Gerdin wrote:
> Jon,
>
> On Wednesday 22 January 2014 07.10.33 Jon Masamitsu wrote:
>> Mikael,
>>
>> http://cr.openjdk.java.net/~mgerdin/8032379/webrev.0/src/share/vm/gc_impleme
>> ntation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp.frames.html
>>
>> I don't mean to expand this task but the comment after the parameter
>> "do_code_roots" caught my eye.
>>
>>> 3736       gch->gen_process_strong_roots(_cmsGen->level(),
>>> 3737                                     true,   // younger gens are roots
>>> 3738                                     true,   // activate
>>> StrongRootsScope 3739
>>> SharedHeap::ScanningOption(roots_scanning_options()), 3740
>>>                       &notOlder,
>>> 3741                                     true,// walk all of code cache if
>>> (so & SO_AllCodeCache) 3742                                     NULL,
>>> 3743                                     &klass_closure);
>> Did you consider whether the "do_code_roots" is needed any more?
> The comment is not incorrect, but there is a second effect to setting
> do_code_roots. With do_code_roots set we will call do_oop on all on-stack
> nmethods regardless of the ScanOption value.

OK.

>
> (do_code_roots is only ever false at one point where I can see, so we may want
> to get rid of it at some point anyway)
>
>> http://cr.openjdk.java.net/~mgerdin/8032379/webrev.0/src/share/vm/memory/sha
>> redHeap.cpp.frames.html
>>>    208     if (so & SO_ScavengeCodeCache) {
>>>    209       assert(code_roots != NULL, "must supply closure for code
>>>    cache");
>>>    210
>>>    211       // We only visit parts of the CodeCache when scavenging.
>>>    212       CodeCache::scavenge_root_nmethods_do(code_roots);
>>>    213     }
>>>    214     if (so & SO_AllCodeCache) {
>>>    215       assert(code_roots != NULL, "must supply closure for code
>>>    cache");
>>>    216
>>>    217       // CMSCollector uses this to do intermediate-strength
>>>    collections. 218       // We scan the entire code cache, since
>>>    CodeCache::do_unloading is not called. 219
>>>    CodeCache::blobs_do(code_roots);
>>>    220     }
>> The new code allows for scavenge_root_nmethods_do() and blobs_do() both
>> to be called
>> (depending on the contents of "so").  That could not happen with the old
>> code.  Is that
>> OK?  I didn't read enough code to know if blobs_do would also process
>> the same roots
>> again as scavenge_root_nmethods_do().
> It will not cause any problems since nmethods are "claimed" when scanned so we
> won't call oops_do on them twice even if SO_AllCodeCache|SO_ScavengeCodeCache
> is set. As I hinted at above we may already have seen some of the nmethods due
> to the CodeBlobClosure being passed to Threads::oops_do.

OK.  All good then.

Jon

>
>> That's all.  Rest looks good.  Nice change.
> Thanks Jon.
> /Mikael
>
>> Jon
>>
>> On 1/21/2014 5:13 AM, Mikael Gerdin wrote:
>>> Hi all,
>>>
>>> as a part of implementing JEP-156 (G1 class unloading) we are doing some
>>> cleanups in order to refactor the strong root processing code.
>>>
>>> Currently there are two "dimensions" in which
>>> SharedHeap::process_strong_roots is configured. One is the ScanOption
>>> enum, the other is the is_scavenging booelan. The semantic meaning of
>>> is_scavenging can easily be folded into the ScanOption enum by:
>>>
>>> * Introducing a SO_AllCodeCache/SO_ScavengeCodeCache distinction (in a way
>>> similar to SO_AllClasses/SO_SystemClasses)
>>> * Noting that passing a CLD closure to Threads::oops_do is only needed
>>> when we want to determine the precise liveness of classes, this is
>>> already signaled by SO_SystemClasses.
>>>
>>> Bug link: https://bugs.openjdk.java.net/browse/JDK-8032379
>>> Webrev: http://cr.openjdk.java.net/~mgerdin/8032379/webrev.0
>>>
>>> Thanks
>>> /Mikael




More information about the hotspot-gc-dev mailing list