src/share/vm/memory/metaspaceCounters.cpp

changeset 5531
1a8fb39bdbc4
parent 5015
868d87ed63c8
child 5694
7944aba7ba41
equal deleted inserted replaced
5529:e5003079dfa5 5531:1a8fb39bdbc4
23 */ 23 */
24 24
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "memory/metaspaceCounters.hpp" 26 #include "memory/metaspaceCounters.hpp"
27 #include "memory/resourceArea.hpp" 27 #include "memory/resourceArea.hpp"
28 #include "runtime/globals.hpp"
29 #include "runtime/perfData.hpp"
28 #include "utilities/exceptions.hpp" 30 #include "utilities/exceptions.hpp"
29 31
30 MetaspaceCounters* MetaspaceCounters::_metaspace_counters = NULL; 32 class MetaspacePerfCounters: public CHeapObj<mtInternal> {
33 friend class VMStructs;
34 PerfVariable* _capacity;
35 PerfVariable* _used;
36 PerfVariable* _max_capacity;
31 37
32 size_t MetaspaceCounters::calc_total_capacity() { 38 PerfVariable* create_variable(const char *ns, const char *name, size_t value, TRAPS) {
39 const char *path = PerfDataManager::counter_name(ns, name);
40 return PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value, THREAD);
41 }
42
43 void create_constant(const char *ns, const char *name, size_t value, TRAPS) {
44 const char *path = PerfDataManager::counter_name(ns, name);
45 PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, THREAD);
46 }
47
48 public:
49 MetaspacePerfCounters(const char* ns, size_t min_capacity, size_t curr_capacity, size_t max_capacity, size_t used) {
50 EXCEPTION_MARK;
51 ResourceMark rm;
52
53 create_constant(ns, "minCapacity", min_capacity, THREAD);
54 _capacity = create_variable(ns, "capacity", curr_capacity, THREAD);
55 _max_capacity = create_variable(ns, "maxCapacity", max_capacity, THREAD);
56 _used = create_variable(ns, "used", used, THREAD);
57 }
58
59 void update(size_t capacity, size_t max_capacity, size_t used) {
60 _capacity->set_value(capacity);
61 _max_capacity->set_value(max_capacity);
62 _used->set_value(used);
63 }
64 };
65
66 MetaspacePerfCounters* MetaspaceCounters::_perf_counters = NULL;
67
68 size_t MetaspaceCounters::calculate_capacity() {
33 // The total capacity is the sum of 69 // The total capacity is the sum of
34 // 1) capacity of Metachunks in use by all Metaspaces 70 // 1) capacity of Metachunks in use by all Metaspaces
35 // 2) unused space at the end of each Metachunk 71 // 2) unused space at the end of each Metachunk
36 // 3) space in the freelist 72 // 3) space in the freelist
37 size_t total_capacity = MetaspaceAux::allocated_capacity_bytes() 73 size_t total_capacity = MetaspaceAux::allocated_capacity_bytes()
38 + MetaspaceAux::free_bytes() + MetaspaceAux::free_chunks_total_in_bytes(); 74 + MetaspaceAux::free_bytes() + MetaspaceAux::free_chunks_total_in_bytes();
39 return total_capacity; 75 return total_capacity;
40 } 76 }
41 77
42 MetaspaceCounters::MetaspaceCounters() : 78 void MetaspaceCounters::initialize_performance_counters() {
43 _capacity(NULL),
44 _used(NULL),
45 _max_capacity(NULL) {
46 if (UsePerfData) { 79 if (UsePerfData) {
80 assert(_perf_counters == NULL, "Should only be initialized once");
81
47 size_t min_capacity = MetaspaceAux::min_chunk_size(); 82 size_t min_capacity = MetaspaceAux::min_chunk_size();
83 size_t capacity = calculate_capacity();
48 size_t max_capacity = MetaspaceAux::reserved_in_bytes(); 84 size_t max_capacity = MetaspaceAux::reserved_in_bytes();
49 size_t curr_capacity = calc_total_capacity();
50 size_t used = MetaspaceAux::allocated_used_bytes(); 85 size_t used = MetaspaceAux::allocated_used_bytes();
51 86
52 initialize(min_capacity, max_capacity, curr_capacity, used); 87 _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity, capacity, max_capacity, used);
53 }
54 }
55
56 static PerfVariable* create_ms_variable(const char *ns,
57 const char *name,
58 size_t value,
59 TRAPS) {
60 const char *path = PerfDataManager::counter_name(ns, name);
61 PerfVariable *result =
62 PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value,
63 CHECK_NULL);
64 return result;
65 }
66
67 static void create_ms_constant(const char *ns,
68 const char *name,
69 size_t value,
70 TRAPS) {
71 const char *path = PerfDataManager::counter_name(ns, name);
72 PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, CHECK);
73 }
74
75 void MetaspaceCounters::initialize(size_t min_capacity,
76 size_t max_capacity,
77 size_t curr_capacity,
78 size_t used) {
79
80 if (UsePerfData) {
81 EXCEPTION_MARK;
82 ResourceMark rm;
83
84 const char *ms = "metaspace";
85
86 create_ms_constant(ms, "minCapacity", min_capacity, CHECK);
87 _max_capacity = create_ms_variable(ms, "maxCapacity", max_capacity, CHECK);
88 _capacity = create_ms_variable(ms, "capacity", curr_capacity, CHECK);
89 _used = create_ms_variable(ms, "used", used, CHECK);
90 }
91 }
92
93 void MetaspaceCounters::update_capacity() {
94 assert(UsePerfData, "Should not be called unless being used");
95 size_t total_capacity = calc_total_capacity();
96 _capacity->set_value(total_capacity);
97 }
98
99 void MetaspaceCounters::update_used() {
100 assert(UsePerfData, "Should not be called unless being used");
101 size_t used_in_bytes = MetaspaceAux::allocated_used_bytes();
102 _used->set_value(used_in_bytes);
103 }
104
105 void MetaspaceCounters::update_max_capacity() {
106 assert(UsePerfData, "Should not be called unless being used");
107 assert(_max_capacity != NULL, "Should be initialized");
108 size_t reserved_in_bytes = MetaspaceAux::reserved_in_bytes();
109 _max_capacity->set_value(reserved_in_bytes);
110 }
111
112 void MetaspaceCounters::update_all() {
113 if (UsePerfData) {
114 update_used();
115 update_capacity();
116 update_max_capacity();
117 }
118 }
119
120 void MetaspaceCounters::initialize_performance_counters() {
121 if (UsePerfData) {
122 assert(_metaspace_counters == NULL, "Should only be initialized once");
123 _metaspace_counters = new MetaspaceCounters();
124 } 88 }
125 } 89 }
126 90
127 void MetaspaceCounters::update_performance_counters() { 91 void MetaspaceCounters::update_performance_counters() {
128 if (UsePerfData) { 92 if (UsePerfData) {
129 assert(_metaspace_counters != NULL, "Should be initialized"); 93 assert(_perf_counters != NULL, "Should be initialized");
130 _metaspace_counters->update_all(); 94
95 size_t capacity = calculate_capacity();
96 size_t max_capacity = MetaspaceAux::reserved_in_bytes();
97 size_t used = MetaspaceAux::allocated_used_bytes();
98
99 _perf_counters->update(capacity, max_capacity, used);
131 } 100 }
132 } 101 }
133 102
103 MetaspacePerfCounters* CompressedClassSpaceCounters::_perf_counters = NULL;
104
105 size_t CompressedClassSpaceCounters::calculate_capacity() {
106 return MetaspaceAux::allocated_capacity_bytes(_class_type) +
107 MetaspaceAux::free_bytes(_class_type) +
108 MetaspaceAux::free_chunks_total_in_bytes(_class_type);
109 }
110
111 void CompressedClassSpaceCounters::update_performance_counters() {
112 if (UsePerfData && UseCompressedKlassPointers) {
113 assert(_perf_counters != NULL, "Should be initialized");
114
115 size_t capacity = calculate_capacity();
116 size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
117 size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
118
119 _perf_counters->update(capacity, max_capacity, used);
120 }
121 }
122
123 void CompressedClassSpaceCounters::initialize_performance_counters() {
124 if (UsePerfData) {
125 assert(_perf_counters == NULL, "Should only be initialized once");
126 const char* ns = "compressedclassspace";
127
128 if (UseCompressedKlassPointers) {
129 size_t min_capacity = MetaspaceAux::min_chunk_size();
130 size_t capacity = calculate_capacity();
131 size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
132 size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
133
134 _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity, max_capacity, used);
135 } else {
136 _perf_counters = new MetaspacePerfCounters(ns, 0, 0, 0, 0);
137 }
138 }
139 }

mercurial