< 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 >