< prev index next >

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

Print this page
rev 9705 : [backport] Implement early update references phase.


  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 {
< prev index next >