< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMetrics.cpp

Print this page

 47 // For full GC, generation is always Global.
 48 //
 49 // Note that the size of the chosen collection set is proportional to the relevant generation's collection set.
 50 // Note also that the generation size may change following selection of the collection set, as a side effect
 51 // of evacuation.  Evacuation may promote objects, causing old to grow and young to shrink.  Or this may be a
 52 // mixed evacuation.  When old regions are evacuated, this typically allows young to expand.  In all of these
 53 // various scenarios, the purpose of asking is_good_progress() is to determine if there is enough memory available
 54 // within young generation to justify making an attempt to perform a concurrent collection.  For this reason, we'll
 55 // use the current size of the generation (which may not be different than when the collection set was chosen) to
 56 // assess how much free memory we require in order to consider the most recent GC to have had good progress.
 57 
 58 bool ShenandoahMetricsSnapshot::is_good_progress(ShenandoahGeneration* generation) {
 59   // Under the critical threshold?
 60   ShenandoahFreeSet* free_set = _heap->free_set();
 61   size_t free_actual   = free_set->available();
 62   assert(free_actual != ShenandoahFreeSet::FreeSetUnderConstruction, "Avoid this race");
 63 
 64   // ShenandoahCriticalFreeThreshold is expressed as a percentage.  We multiple this percentage by 1/100th
 65   // of the generation capacity to determine whether the available memory within the generation exceeds the
 66   // critical threshold.
 67   size_t free_expected = (generation->max_capacity() / 100) * ShenandoahCriticalFreeThreshold;
 68 
 69   bool prog_free = free_actual >= free_expected;
 70   log_info(gc, ergo)("%s progress for free space: %zu%s, need %zu%s",
 71                      prog_free ? "Good" : "Bad",
 72                      byte_size_in_proper_unit(free_actual),   proper_unit_for_byte_size(free_actual),
 73                      byte_size_in_proper_unit(free_expected), proper_unit_for_byte_size(free_expected));
 74   if (!prog_free) {
 75     return false;
 76   }
 77 
 78   // Freed up enough?
 79   size_t progress_actual   = (_used_before > _used_after) ? _used_before - _used_after : 0;
 80   size_t progress_expected = ShenandoahHeapRegion::region_size_bytes();
 81   bool prog_used = progress_actual >= progress_expected;
 82   log_info(gc, ergo)("%s progress for used space: %zu%s, need %zu%s",
 83                      prog_used ? "Good" : "Bad",
 84                      byte_size_in_proper_unit(progress_actual),   proper_unit_for_byte_size(progress_actual),
 85                      byte_size_in_proper_unit(progress_expected), proper_unit_for_byte_size(progress_expected));
 86   if (prog_used) {
 87     return true;

 47 // For full GC, generation is always Global.
 48 //
 49 // Note that the size of the chosen collection set is proportional to the relevant generation's collection set.
 50 // Note also that the generation size may change following selection of the collection set, as a side effect
 51 // of evacuation.  Evacuation may promote objects, causing old to grow and young to shrink.  Or this may be a
 52 // mixed evacuation.  When old regions are evacuated, this typically allows young to expand.  In all of these
 53 // various scenarios, the purpose of asking is_good_progress() is to determine if there is enough memory available
 54 // within young generation to justify making an attempt to perform a concurrent collection.  For this reason, we'll
 55 // use the current size of the generation (which may not be different than when the collection set was chosen) to
 56 // assess how much free memory we require in order to consider the most recent GC to have had good progress.
 57 
 58 bool ShenandoahMetricsSnapshot::is_good_progress(ShenandoahGeneration* generation) {
 59   // Under the critical threshold?
 60   ShenandoahFreeSet* free_set = _heap->free_set();
 61   size_t free_actual   = free_set->available();
 62   assert(free_actual != ShenandoahFreeSet::FreeSetUnderConstruction, "Avoid this race");
 63 
 64   // ShenandoahCriticalFreeThreshold is expressed as a percentage.  We multiple this percentage by 1/100th
 65   // of the generation capacity to determine whether the available memory within the generation exceeds the
 66   // critical threshold.
 67   size_t free_expected = (ShenandoahHeap::heap()->soft_max_capacity() / 100) * ShenandoahCriticalFreeThreshold;
 68 
 69   bool prog_free = free_actual >= free_expected;
 70   log_info(gc, ergo)("%s progress for free space: %zu%s, need %zu%s",
 71                      prog_free ? "Good" : "Bad",
 72                      byte_size_in_proper_unit(free_actual),   proper_unit_for_byte_size(free_actual),
 73                      byte_size_in_proper_unit(free_expected), proper_unit_for_byte_size(free_expected));
 74   if (!prog_free) {
 75     return false;
 76   }
 77 
 78   // Freed up enough?
 79   size_t progress_actual   = (_used_before > _used_after) ? _used_before - _used_after : 0;
 80   size_t progress_expected = ShenandoahHeapRegion::region_size_bytes();
 81   bool prog_used = progress_actual >= progress_expected;
 82   log_info(gc, ergo)("%s progress for used space: %zu%s, need %zu%s",
 83                      prog_used ? "Good" : "Bad",
 84                      byte_size_in_proper_unit(progress_actual),   proper_unit_for_byte_size(progress_actual),
 85                      byte_size_in_proper_unit(progress_expected), proper_unit_for_byte_size(progress_expected));
 86   if (prog_used) {
 87     return true;
< prev index next >