RFR: JDK-8077842 - Remove the level parameter passed around in GenCollectedHeap

Kim Barrett kim.barrett at oracle.com
Mon Apr 20 19:28:50 UTC 2015


On Apr 15, 2015, at 1:59 PM, Jesper Wilhelmsson <jesper.wilhelmsson at oracle.com> wrote:
> 
> Hi,
> 
> Please review the next cleanup in the generation cleanup series. This time the 'level' is at stake. We pass it around in lots of places but in reality we already know which level (i.e. generation) we want to work with, so the level is just noise. In some places we want to verify that we are in the correct generation, or we pass a generation on to some generic code that can work on both young and old, in these cases we are now more explicit and makes it clear which generation we are dealing with instead of just sending a number.
> 
> Bug: https://bugs.openjdk.java.net/browse/JDK-8077842
> Webrev: http://cr.openjdk.java.net/~jwilhelm/8077842/webrev.00/
> 
> Thanks,
> /Jesper

------------------------------------------------------------------------------
agent/src/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java
  87     return ((gen != null) && (gen == ((GenCollectedHeap)heap).getGen(0)));
and
  91     return ((gen != null) && (gen == ((GenCollectedHeap)heap).getGen(1)));

Strictly speaking, it seems like the GenCollectedHeap cast ought to be
protected by a try/catch for a bad cast.  Else why is there a
CollectedHeap base class at all?

On the other hand, maybe I'm missing something, but I don't see any
code to assign a value to the "gen" field.

------------------------------------------------------------------------------
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
 688     // I didn't want to change the logging when removing the level concept,
 689     // but I guess this logging could say "old" or something instead of "1".
 690     assert(this == gch->old_gen(),
 691            "The CMS generation should be the old generation");
 692     uint level = 1;

I'm assuming this comment and the retention of level is still
intended, for the reason give.  Is there a followup cleanup RFE for
this?

Similarly in genCollectedHeap.cpp, line 332 and following.
Similarly in generation.cpp, line 115 and following.

------------------------------------------------------------------------------
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
5650   // If the young generation has been collected. Gather any statistics

Comment needs work.  Maybe the period after "collected" should be a
comma?

------------------------------------------------------------------------------ 
src/share/vm/gc_implementation/parNew/parNewGeneration.cpp
 827   ParNewRefProcTaskProxy rp_task(task, _generation, *(gch->old_gen()),

Getting the old_gen like this at this point seems strange.  We were
given the (young) generation at construction time, as a constructor
argument, but here we're going off to the gch to get the old_gen.

------------------------------------------------------------------------------ 
src/share/vm/memory/defNewGeneration.cpp 
  60 DefNewGeneration::IsAliveClosure::IsAliveClosure(Generation* g) : _g(g) { }

This seems to be expecting g to be the young_gen.  There used to be an
assertion, but that assertion has been removed.  I think the assertion
should be retained.

------------------------------------------------------------------------------
src/share/vm/memory/defNewGeneration.cpp 
 106 void DefNewGeneration::FastEvacuateFollowersClosure::do_void() {
 107   do {
 108     _gch->oop_since_save_marks_iterate(Generation::Young, _scan_cur_or_nonheap,
 109                                        _scan_older);
 110   } while (!_gch->no_allocs_since_save_marks(Generation::Young));
 111   guarantee(_gen->promo_failure_scan_is_complete(), "Failed to finish scan");
 112 }

The class is now hard-coded to be for the young generation.  If the
_gen in the final guarantee were changed to obtain the young_gen from
the heap then the generation constructor argument and member variable
would no longer be needed, and could no longer accidentally be wrong.

------------------------------------------------------------------------------ 
src/share/vm/memory/defNewGeneration.cpp 
 370   // This is called after a gc that includes the following generation
 371   // (which is required to exist.)  So from-space will normally be empty.

This comment about "the following generation" needs updating.

------------------------------------------------------------------------------
src/share/vm/memory/genCollectedHeap.hpp
 376   // Invoke the "do_oop" method of one of the closures "not_older_gens"
 377   // or "older_gens" on root locations for the generations depending on
 378   // the type.  (The "older_gens" closure is used for scanning references
 379   // from older generations; "not_older_gens" is used everywhere else.)

Is cleanup of the terminology in this comment and the associated
parameter names intended to be part of a later part of this series?
"older_gens" no longer makes sense, for example; it should just be
"old_gen_cl" or something like that.

------------------------------------------------------------------------------ 
src/share/vm/memory/genCollectedHeap.cpp
1121 GCStats* GenCollectedHeap::gc_stats(Generation* gen) const {
1122   return gen->gc_stats();

Is GenCollectedHeap::gc_stats() worth keeping now?

------------------------------------------------------------------------------



More information about the hotspot-gc-dev mailing list