44
45 cname = PerfDataManager::counter_name(_name_space, "max_regions");
46 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, max_regions, CHECK);
47
48 cname = PerfDataManager::counter_name(_name_space, "region_size");
49 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, ShenandoahHeapRegion::region_size_bytes() >> 10, CHECK);
50
51 cname = PerfDataManager::counter_name(_name_space, "status");
52 _status = PerfDataManager::create_long_variable(SUN_GC, cname,
53 PerfData::U_None, CHECK);
54
55 _regions_data = NEW_C_HEAP_ARRAY(PerfVariable*, max_regions, mtGC);
56 for (uint i = 0; i < max_regions; i++) {
57 const char* reg_name = PerfDataManager::name_space(_name_space, "region", i);
58 const char* data_name = PerfDataManager::counter_name(reg_name, "data");
59 const char* ns = PerfDataManager::ns_to_string(SUN_GC);
60 const char* fullname = PerfDataManager::counter_name(ns, data_name);
61 assert(!PerfDataManager::exists(fullname), "must not exist");
62 _regions_data[i] = PerfDataManager::create_long_variable(SUN_GC, data_name,
63 PerfData::U_None, CHECK);
64
65 }
66 }
67 }
68
69 ShenandoahHeapRegionCounters::~ShenandoahHeapRegionCounters() {
70 if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
71 }
72
73 void ShenandoahHeapRegionCounters::update() {
74 if (ShenandoahRegionSampling) {
75 jlong current = os::javaTimeMillis();
76 jlong last = _last_sample_millis;
77 if (current - last > ShenandoahRegionSamplingRate &&
78 Atomic::cmpxchg(current, &_last_sample_millis, last) == last) {
79
80 ShenandoahHeap* heap = ShenandoahHeap::heap();
81 jlong status = 0;
82 if (heap->concurrent_mark_in_progress()) status |= 1;
83 if (heap->is_evacuation_in_progress()) status |= 2;
84 _status->set_value(status);
85
86 _timestamp->set_value(os::elapsed_counter());
87
88 size_t num_regions = heap->num_regions();
89 size_t max_regions = heap->max_regions();
90 ShenandoahHeapRegionSet* regions = heap->regions();
91 for (uint i = 0; i < max_regions; i++) {
92 if (i < num_regions) {
93 ShenandoahHeapRegion* r = regions->get(i);
94 jlong data = ((r->used() >> 10) & USED_MASK) << USED_SHIFT;
95 data |= ((r->get_live_data_bytes() >> 10) & LIVE_MASK) << LIVE_SHIFT;
96 jlong flags = 0;
97 if (r->in_collection_set()) flags |= 1 << 1;
98 if (r->is_humongous()) flags |= 1 << 2;
99 if (r->is_recently_allocated()) flags |= 1 << 3;
100 if (r->is_pinned()) flags |= 1 << 4;
101 data |= (flags & FLAGS_MASK) << FLAGS_SHIFT;
102 _regions_data[i]->set_value(data);
103 } else {
|
44
45 cname = PerfDataManager::counter_name(_name_space, "max_regions");
46 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, max_regions, CHECK);
47
48 cname = PerfDataManager::counter_name(_name_space, "region_size");
49 PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, ShenandoahHeapRegion::region_size_bytes() >> 10, CHECK);
50
51 cname = PerfDataManager::counter_name(_name_space, "status");
52 _status = PerfDataManager::create_long_variable(SUN_GC, cname,
53 PerfData::U_None, CHECK);
54
55 _regions_data = NEW_C_HEAP_ARRAY(PerfVariable*, max_regions, mtGC);
56 for (uint i = 0; i < max_regions; i++) {
57 const char* reg_name = PerfDataManager::name_space(_name_space, "region", i);
58 const char* data_name = PerfDataManager::counter_name(reg_name, "data");
59 const char* ns = PerfDataManager::ns_to_string(SUN_GC);
60 const char* fullname = PerfDataManager::counter_name(ns, data_name);
61 assert(!PerfDataManager::exists(fullname), "must not exist");
62 _regions_data[i] = PerfDataManager::create_long_variable(SUN_GC, data_name,
63 PerfData::U_None, CHECK);
64 }
65 }
66 }
67
68 ShenandoahHeapRegionCounters::~ShenandoahHeapRegionCounters() {
69 if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space, mtGC);
70 }
71
72 void ShenandoahHeapRegionCounters::update() {
73 if (ShenandoahRegionSampling) {
74 jlong current = os::javaTimeMillis();
75 jlong last = _last_sample_millis;
76 if (current - last > ShenandoahRegionSamplingRate &&
77 Atomic::cmpxchg(current, &_last_sample_millis, last) == last) {
78
79 ShenandoahHeap* heap = ShenandoahHeap::heap();
80 jlong status = 0;
81 if (heap->concurrent_mark_in_progress()) status |= 1 << 0;
82 if (heap->is_evacuation_in_progress()) status |= 1 << 1;
83 if (heap->is_update_refs_in_progress()) status |= 1 << 2;
84 _status->set_value(status);
85
86 _timestamp->set_value(os::elapsed_counter());
87
88 size_t num_regions = heap->num_regions();
89 size_t max_regions = heap->max_regions();
90 ShenandoahHeapRegionSet* regions = heap->regions();
91 for (uint i = 0; i < max_regions; i++) {
92 if (i < num_regions) {
93 ShenandoahHeapRegion* r = regions->get(i);
94 jlong data = ((r->used() >> 10) & USED_MASK) << USED_SHIFT;
95 data |= ((r->get_live_data_bytes() >> 10) & LIVE_MASK) << LIVE_SHIFT;
96 jlong flags = 0;
97 if (r->in_collection_set()) flags |= 1 << 1;
98 if (r->is_humongous()) flags |= 1 << 2;
99 if (r->is_recently_allocated()) flags |= 1 << 3;
100 if (r->is_pinned()) flags |= 1 << 4;
101 data |= (flags & FLAGS_MASK) << FLAGS_SHIFT;
102 _regions_data[i]->set_value(data);
103 } else {
|