Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1MonitoringSupport.cpp @ 3289:b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
Summary: Added counters for jstat
Reviewed-by: tonyp, jwilhelm, stefank, ysr, johnc
author | jmasa |
---|---|
date | Thu, 21 Apr 2011 10:23:44 -0700 |
parents | |
children | 8229bd737950 |
comparison
equal
deleted
inserted
replaced
3288:c0dcda80820f | 3289:b52782ae3880 |
---|---|
1 /* | |
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #include "precompiled.hpp" | |
26 #include "gc_implementation/g1/g1MonitoringSupport.hpp" | |
27 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | |
28 #include "gc_implementation/g1/g1CollectorPolicy.hpp" | |
29 | |
30 G1MonitoringSupport::G1MonitoringSupport(G1CollectedHeap* g1h, | |
31 VirtualSpace* g1_storage_addr) : | |
32 _g1h(g1h), | |
33 _incremental_collection_counters(NULL), | |
34 _full_collection_counters(NULL), | |
35 _non_young_collection_counters(NULL), | |
36 _old_space_counters(NULL), | |
37 _young_collection_counters(NULL), | |
38 _eden_counters(NULL), | |
39 _from_counters(NULL), | |
40 _to_counters(NULL), | |
41 _g1_storage_addr(g1_storage_addr) | |
42 { | |
43 // Counters for GC collections | |
44 // | |
45 // name "collector.0". In a generational collector this would be the | |
46 // young generation collection. | |
47 _incremental_collection_counters = | |
48 new CollectorCounters("G1 incremental collections", 0); | |
49 // name "collector.1". In a generational collector this would be the | |
50 // old generation collection. | |
51 _full_collection_counters = | |
52 new CollectorCounters("G1 stop-the-world full collections", 1); | |
53 | |
54 // timer sampling for all counters supporting sampling only update the | |
55 // used value. See the take_sample() method. G1 requires both used and | |
56 // capacity updated so sampling is not currently used. It might | |
57 // be sufficient to update all counters in take_sample() even though | |
58 // take_sample() only returns "used". When sampling was used, there | |
59 // were some anomolous values emitted which may have been the consequence | |
60 // of not updating all values simultaneously (i.e., see the calculation done | |
61 // in eden_space_used(), is it possbile that the values used to | |
62 // calculate either eden_used or survivor_used are being updated by | |
63 // the collector when the sample is being done?). | |
64 const bool sampled = false; | |
65 | |
66 // "Generation" and "Space" counters. | |
67 // | |
68 // name "generation.1" This is logically the old generation in | |
69 // generational GC terms. The "1, 1" parameters are for | |
70 // the n-th generation (=1) with 1 space. | |
71 // Counters are created from minCapacity, maxCapacity, and capacity | |
72 _non_young_collection_counters = | |
73 new GenerationCounters("whole heap", 1, 1, _g1_storage_addr); | |
74 | |
75 // name "generation.1.space.0" | |
76 // Counters are created from maxCapacity, capacity, initCapacity, | |
77 // and used. | |
78 _old_space_counters = new HSpaceCounters("space", 0, | |
79 _g1h->max_capacity(), _g1h->capacity(), _non_young_collection_counters); | |
80 | |
81 // Young collection set | |
82 // name "generation.0". This is logically the young generation. | |
83 // The "0, 3" are paremeters for the n-th genertaion (=0) with 3 spaces. | |
84 // See _non_young_collection_counters for additional counters | |
85 _young_collection_counters = new GenerationCounters("young", 0, 3, NULL); | |
86 | |
87 // Replace "max_heap_byte_size() with maximum young gen size for | |
88 // g1Collectedheap | |
89 // name "generation.0.space.0" | |
90 // See _old_space_counters for additional counters | |
91 _eden_counters = new HSpaceCounters("eden", 0, | |
92 _g1h->max_capacity(), eden_space_committed(), | |
93 _young_collection_counters); | |
94 | |
95 // name "generation.0.space.1" | |
96 // See _old_space_counters for additional counters | |
97 // Set the arguments to indicate that this survivor space is not used. | |
98 _from_counters = new HSpaceCounters("s0", 1, (long) 0, (long) 0, | |
99 _young_collection_counters); | |
100 | |
101 // name "generation.0.space.2" | |
102 // See _old_space_counters for additional counters | |
103 _to_counters = new HSpaceCounters("s1", 2, | |
104 _g1h->max_capacity(), | |
105 survivor_space_committed(), | |
106 _young_collection_counters); | |
107 } | |
108 | |
109 size_t G1MonitoringSupport::overall_committed() { | |
110 return g1h()->capacity(); | |
111 } | |
112 | |
113 size_t G1MonitoringSupport::overall_used() { | |
114 return g1h()->used_unlocked(); | |
115 } | |
116 | |
117 size_t G1MonitoringSupport::eden_space_committed() { | |
118 return MAX2(eden_space_used(), (size_t) HeapRegion::GrainBytes); | |
119 } | |
120 | |
121 size_t G1MonitoringSupport::eden_space_used() { | |
122 size_t young_list_length = g1h()->young_list()->length(); | |
123 size_t eden_used = young_list_length * HeapRegion::GrainBytes; | |
124 size_t survivor_used = survivor_space_used(); | |
125 eden_used = subtract_up_to_zero(eden_used, survivor_used); | |
126 return eden_used; | |
127 } | |
128 | |
129 size_t G1MonitoringSupport::survivor_space_committed() { | |
130 return MAX2(survivor_space_used(), | |
131 (size_t) HeapRegion::GrainBytes); | |
132 } | |
133 | |
134 size_t G1MonitoringSupport::survivor_space_used() { | |
135 size_t survivor_num = g1h()->g1_policy()->recorded_survivor_regions(); | |
136 size_t survivor_used = survivor_num * HeapRegion::GrainBytes; | |
137 return survivor_used; | |
138 } | |
139 | |
140 size_t G1MonitoringSupport::old_space_committed() { | |
141 size_t committed = overall_committed(); | |
142 size_t eden_committed = eden_space_committed(); | |
143 size_t survivor_committed = survivor_space_committed(); | |
144 committed = subtract_up_to_zero(committed, eden_committed); | |
145 committed = subtract_up_to_zero(committed, survivor_committed); | |
146 committed = MAX2(committed, (size_t) HeapRegion::GrainBytes); | |
147 return committed; | |
148 } | |
149 | |
150 // See the comment near the top of g1MonitoringSupport.hpp for | |
151 // an explanation of these calculations for "used" and "capacity". | |
152 size_t G1MonitoringSupport::old_space_used() { | |
153 size_t used = overall_used(); | |
154 size_t eden_used = eden_space_used(); | |
155 size_t survivor_used = survivor_space_used(); | |
156 used = subtract_up_to_zero(used, eden_used); | |
157 used = subtract_up_to_zero(used, survivor_used); | |
158 return used; | |
159 } | |
160 | |
161 void G1MonitoringSupport::update_counters() { | |
162 if (UsePerfData) { | |
163 eden_counters()->update_capacity(eden_space_committed()); | |
164 eden_counters()->update_used(eden_space_used()); | |
165 to_counters()->update_capacity(survivor_space_committed()); | |
166 to_counters()->update_used(survivor_space_used()); | |
167 old_space_counters()->update_capacity(old_space_committed()); | |
168 old_space_counters()->update_used(old_space_used()); | |
169 non_young_collection_counters()->update_all(); | |
170 } | |
171 } | |
172 | |
173 void G1MonitoringSupport::update_eden_counters() { | |
174 if (UsePerfData) { | |
175 eden_counters()->update_capacity(eden_space_committed()); | |
176 eden_counters()->update_used(eden_space_used()); | |
177 } | |
178 } |