--- a/hotspot/src/share/vm/memory/metaspaceCounters.cpp Fri Feb 01 17:02:36 2013 -0800
+++ b/hotspot/src/share/vm/memory/metaspaceCounters.cpp Mon Mar 04 13:01:24 2013 +0100
@@ -25,12 +25,14 @@
#include "precompiled.hpp"
#include "memory/metaspaceCounters.hpp"
#include "memory/resourceArea.hpp"
-
-#define METASPACE_NAME "perm"
+#include "utilities/exceptions.hpp"
MetaspaceCounters* MetaspaceCounters::_metaspace_counters = NULL;
-MetaspaceCounters::MetaspaceCounters() {
+MetaspaceCounters::MetaspaceCounters() :
+ _capacity(NULL),
+ _used(NULL),
+ _max_capacity(NULL) {
if (UsePerfData) {
size_t min_capacity = MetaspaceAux::min_chunk_size();
size_t max_capacity = MetaspaceAux::reserved_in_bytes();
@@ -41,6 +43,25 @@
}
}
+static PerfVariable* create_ms_variable(const char *ns,
+ const char *name,
+ size_t value,
+ TRAPS) {
+ const char *path = PerfDataManager::counter_name(ns, name);
+ PerfVariable *result =
+ PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value,
+ CHECK_NULL);
+ return result;
+}
+
+static void create_ms_constant(const char *ns,
+ const char *name,
+ size_t value,
+ TRAPS) {
+ const char *path = PerfDataManager::counter_name(ns, name);
+ PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, CHECK);
+}
+
void MetaspaceCounters::initialize(size_t min_capacity,
size_t max_capacity,
size_t curr_capacity,
@@ -50,93 +71,32 @@
EXCEPTION_MARK;
ResourceMark rm;
- // Create a name that will be recognized by jstat tools as
- // the perm gen. Change this to a Metaspace name when the
- // tools are fixed.
- // name to recognize "sun.gc.generation.2.*"
-
- const char* name = METASPACE_NAME;
- const int ordinal = 2;
- const int spaces = 1;
-
- const char* cns = PerfDataManager::name_space("generation", ordinal);
-
- _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtClass);
- strcpy(_name_space, cns);
-
- const char* cname = PerfDataManager::counter_name(_name_space, "name");
- PerfDataManager::create_string_constant(SUN_GC, cname, name, CHECK);
-
- // End of perm gen like name creation
-
- cname = PerfDataManager::counter_name(_name_space, "spaces");
- PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None,
- spaces, CHECK);
-
- cname = PerfDataManager::counter_name(_name_space, "minCapacity");
- PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_Bytes,
- min_capacity, CHECK);
-
- cname = PerfDataManager::counter_name(_name_space, "maxCapacity");
- PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_Bytes,
- max_capacity, CHECK);
+ const char *ms = "metaspace";
- cname = PerfDataManager::counter_name(_name_space, "capacity");
- _current_size =
- PerfDataManager::create_variable(SUN_GC, cname, PerfData::U_Bytes,
- curr_capacity, CHECK);
-
- // SpaceCounter like counters
- // name to recognize "sun.gc.generation.2.space.0.*"
- {
- const int space_ordinal = 0;
- const char* cns = PerfDataManager::name_space(_name_space, "space",
- space_ordinal);
-
- char* space_name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtClass);
- strcpy(space_name_space, cns);
-
- const char* cname = PerfDataManager::counter_name(space_name_space, "name");
- PerfDataManager::create_string_constant(SUN_GC, cname, name, CHECK);
-
- cname = PerfDataManager::counter_name(space_name_space, "maxCapacity");
- _max_capacity = PerfDataManager::create_variable(SUN_GC, cname,
- PerfData::U_Bytes,
- (jlong)max_capacity, CHECK);
-
- cname = PerfDataManager::counter_name(space_name_space, "capacity");
- _capacity = PerfDataManager::create_variable(SUN_GC, cname,
- PerfData::U_Bytes,
- curr_capacity, CHECK);
-
- cname = PerfDataManager::counter_name(space_name_space, "used");
- _used = PerfDataManager::create_variable(SUN_GC,
- cname,
- PerfData::U_Bytes,
- used,
- CHECK);
-
- cname = PerfDataManager::counter_name(space_name_space, "initCapacity");
- PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_Bytes,
- min_capacity, CHECK);
- }
+ create_ms_constant(ms, "minCapacity", min_capacity, CHECK);
+ _max_capacity = create_ms_variable(ms, "maxCapacity", max_capacity, CHECK);
+ _capacity = create_ms_variable(ms, "capacity", curr_capacity, CHECK);
+ _used = create_ms_variable(ms, "used", used, CHECK);
}
}
void MetaspaceCounters::update_capacity() {
assert(UsePerfData, "Should not be called unless being used");
+ assert(_capacity != NULL, "Should be initialized");
size_t capacity_in_bytes = MetaspaceAux::capacity_in_bytes();
_capacity->set_value(capacity_in_bytes);
}
void MetaspaceCounters::update_used() {
assert(UsePerfData, "Should not be called unless being used");
+ assert(_used != NULL, "Should be initialized");
size_t used_in_bytes = MetaspaceAux::used_in_bytes();
_used->set_value(used_in_bytes);
}
void MetaspaceCounters::update_max_capacity() {
assert(UsePerfData, "Should not be called unless being used");
+ assert(_max_capacity != NULL, "Should be initialized");
size_t reserved_in_bytes = MetaspaceAux::reserved_in_bytes();
_max_capacity->set_value(reserved_in_bytes);
}
@@ -146,18 +106,19 @@
update_used();
update_capacity();
update_max_capacity();
- _current_size->set_value(MetaspaceAux::reserved_in_bytes());
}
}
void MetaspaceCounters::initialize_performance_counters() {
if (UsePerfData) {
+ assert(_metaspace_counters == NULL, "Should only be initialized once");
_metaspace_counters = new MetaspaceCounters();
}
}
void MetaspaceCounters::update_performance_counters() {
if (UsePerfData) {
+ assert(_metaspace_counters != NULL, "Should be initialized");
_metaspace_counters->update_all();
}
}