RFR: 8072809 - Clean up gen_process_roots() after generation array removal

Mikael Gerdin mikael.gerdin at oracle.com
Thu Oct 1 13:45:02 UTC 2015


Hi Jesper,

On 2015-09-09 23:02, Jesper Wilhelmsson wrote:
> Hi,
>
> The generation cleanup inspired several other cleanups. Please review a
> few of them here.

I find it a bit odd that the synopsis of the issue focuses on one 
cleanup fix but several others are involved in the suggested change.

Would it be possible to split the *process_roots changes into a 
different changeset?

I think all the non-root-processing changes look good but it's hard to 
get a handle on them since they are a bit spread out.

>
>
> 1. gen_process_roots()
> In the generation array world this method was used to process roots for
> any given generation and did different things based on which generation
> it processed. I split it into two methods, one for the young generation
> and one for the old. This made the code a lot cleaner and easier to
> read. Even though the method was "duplicated" the result is only five
> lines of code longer, and this patch all in all actually removes more
> lines than it adds. :)

I think the split into young_process_roots and old_process_roots is a 
sane one but I do have some comments on the actual implementation:

genCollectedHeap.cpp, young_process_roots:
  677   if (!_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) {
  678     young_gen_closure->reset_generation();
  679   }
is a strange bit of code now that it's been decoupled from the old 
for(level = 0; ...) block

It basically says that for a young gc, one gc thread should reset the 
generation of its root scan closure (the not_older_gens closure)
The generation of that closure has not been changed at any other point 
so it's a pure no-op.

I also think that the not_older_gens (which you renamed to 
young_gen_closure) should be simply named "root_closure" since it's the 
closure that is applied to all the roots.

  672   MarkingCodeBlobClosure mark_code_closure(young_gen_closure, true 
/* young collections are always moving */);
In the rest of the code we pass CodeBlobToOopClosure::FixRelocations 
instead of a raw "true".

old_process_roots:
young_gen_closure is used to scan all roots, both non-heap roots and the 
young generation (if young_gen_as_roots). Can you rename it to 
"root_closure" as I suggested for young_process_roots?

is_moving_collection can be merged with is_adjust_phase, I don't really 
have any opinion on which variable to keep.



>
>
> 2. Generation::spec()
> Generation::spec() is only called in a few places and all of them are
> really looking for the initial size of the generation. I replaced
> Generation::spec() with Generation::initial_size().
>
>
> 3. GenCollectedHeap::gc_stats()
> Not only was this method unused, is was also completely pointless. Removed.
>
>
> 4. Generation::full_collects_young_generation()
> This method is only ever called in old generations, and all old
> generations override it and return !ScavengeBeforeFullGC. The method was
> removed and the flag is checked directly in the only place it was called.

As mentioned above these are good changes but it would be nice to 
extract them from this patch.

/Mikael

>
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8072809
> Webrev: http://cr.openjdk.java.net/~jwilhelm/8072809/webrev.00/
>
> Testing: RBT vm.gc on all platforms.
>
> Thanks,
> /Jesper




More information about the hotspot-gc-dev mailing list