Review Request (M) 8032379: Remove the is_scavenging flag to process_strong_roots
Mikael Gerdin
mikael.gerdin at oracle.com
Wed Jan 22 16:45:32 UTC 2014
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
> > ¬Older,
> > 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.
(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.
>
> 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