< prev index next >

src/share/vm/gc_implementation/shenandoah/shenandoahHeapRegionCounters.cpp

Print this page
rev 9501 : [backport] Update ShenandoahHeapSampling to avoid double counting.
rev 9504 : [backport] Implement early update references phase.
rev 9514 : [backport] Update region sampling to include TLAB/GCLAB allocation data
rev 9515 : [backport] Region sampling may not be enabled because last timetick is uninitialized
rev 9547 : [backport] Trim down native GC footprint
rev 9560 : [backport] Account "shared" out-of-LAB allocations separately

*** 26,38 **** #include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp" #include "gc_implementation/shenandoah/shenandoahHeapRegionSet.hpp" #include "gc_implementation/shenandoah/shenandoahHeapRegionCounters.hpp" #include "runtime/perfData.hpp" ! ShenandoahHeapRegionCounters::ShenandoahHeapRegionCounters() { ! ! if (UsePerfData) { EXCEPTION_MARK; ResourceMark rm; ShenandoahHeap* heap = ShenandoahHeap::heap(); size_t max_regions = heap->max_regions(); const char* cns = PerfDataManager::name_space("shenandoah", "regions"); --- 26,39 ---- #include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp" #include "gc_implementation/shenandoah/shenandoahHeapRegionSet.hpp" #include "gc_implementation/shenandoah/shenandoahHeapRegionCounters.hpp" #include "runtime/perfData.hpp" ! ShenandoahHeapRegionCounters::ShenandoahHeapRegionCounters() : ! _last_sample_millis(0) ! { ! if (UsePerfData && ShenandoahRegionSampling) { EXCEPTION_MARK; ResourceMark rm; ShenandoahHeap* heap = ShenandoahHeap::heap(); size_t max_regions = heap->max_regions(); const char* cns = PerfDataManager::name_space("shenandoah", "regions");
*** 59,69 **** const char* ns = PerfDataManager::ns_to_string(SUN_GC); const char* fullname = PerfDataManager::counter_name(ns, data_name); assert(!PerfDataManager::exists(fullname), "must not exist"); _regions_data[i] = PerfDataManager::create_long_variable(SUN_GC, data_name, PerfData::U_None, CHECK); - } } } ShenandoahHeapRegionCounters::~ShenandoahHeapRegionCounters() { --- 60,69 ----
*** 71,109 **** } void ShenandoahHeapRegionCounters::update() { if (ShenandoahRegionSampling) { jlong current = os::javaTimeMillis(); ! if (current - _last_sample_millis > ShenandoahRegionSamplingRate) { ShenandoahHeap* heap = ShenandoahHeap::heap(); jlong status = 0; ! if (heap->concurrent_mark_in_progress()) status |= 1; ! if (heap->is_evacuation_in_progress()) status |= 2; _status->set_value(status); _timestamp->set_value(os::elapsed_counter()); size_t num_regions = heap->num_regions(); size_t max_regions = heap->max_regions(); ShenandoahHeapRegionSet* regions = heap->regions(); for (uint i = 0; i < max_regions; i++) { if (i < num_regions) { ShenandoahHeapRegion* r = regions->get(i); ! jlong data = ((r->used() >> 10) & USED_MASK) << USED_SHIFT; ! data |= ((r->get_live_data_bytes() >> 10) & LIVE_MASK) << LIVE_SHIFT; jlong flags = 0; if (r->in_collection_set()) flags |= 1 << 1; if (r->is_humongous()) flags |= 1 << 2; ! if (r->is_recently_allocated()) flags |= 1 << 3; ! if (r->is_pinned()) flags |= 1 << 4; data |= (flags & FLAGS_MASK) << FLAGS_SHIFT; _regions_data[i]->set_value(data); } else { jlong flags = 1 << 0; flags = (flags & FLAGS_MASK) << FLAGS_SHIFT; _regions_data[i]->set_value(flags); } } - _last_sample_millis = current; } } } --- 71,116 ---- } void ShenandoahHeapRegionCounters::update() { if (ShenandoahRegionSampling) { jlong current = os::javaTimeMillis(); ! jlong last = _last_sample_millis; ! if (current - last > ShenandoahRegionSamplingRate && ! Atomic::cmpxchg(current, &_last_sample_millis, last) == last) { ! ShenandoahHeap* heap = ShenandoahHeap::heap(); jlong status = 0; ! if (heap->concurrent_mark_in_progress()) status |= 1 << 0; ! if (heap->is_evacuation_in_progress()) status |= 1 << 1; ! if (heap->is_update_refs_in_progress()) status |= 1 << 2; _status->set_value(status); _timestamp->set_value(os::elapsed_counter()); size_t num_regions = heap->num_regions(); size_t max_regions = heap->max_regions(); ShenandoahHeapRegionSet* regions = heap->regions(); + size_t rs = ShenandoahHeapRegion::region_size_bytes(); for (uint i = 0; i < max_regions; i++) { if (i < num_regions) { ShenandoahHeapRegion* r = regions->get(i); ! jlong data = 0; ! data |= ((100 * r->used() / rs) & PERCENT_MASK) << USED_SHIFT; ! data |= ((100 * r->get_live_data_bytes() / rs) & PERCENT_MASK) << LIVE_SHIFT; ! data |= ((100 * r->get_tlab_allocs() / rs) & PERCENT_MASK) << TLAB_SHIFT; ! data |= ((100 * r->get_gclab_allocs() / rs) & PERCENT_MASK) << GCLAB_SHIFT; ! data |= ((100 * r->get_shared_allocs() / rs) & PERCENT_MASK) << SHARED_SHIFT; jlong flags = 0; if (r->in_collection_set()) flags |= 1 << 1; if (r->is_humongous()) flags |= 1 << 2; ! if (r->is_pinned()) flags |= 1 << 3; data |= (flags & FLAGS_MASK) << FLAGS_SHIFT; _regions_data[i]->set_value(data); } else { jlong flags = 1 << 0; flags = (flags & FLAGS_MASK) << FLAGS_SHIFT; _regions_data[i]->set_value(flags); } } } } }
< prev index next >