Mercurial > hg > truffle
annotate src/share/vm/services/memoryManager.cpp @ 5763:a3d71693e0ce
removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class
removed VM call for doing bytecode disassembly
added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file)
added node intrinsics to MaterializeNode
added snippets for the UnsignedMath classes
each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file
the IdealGraphPrinter uses the new BytecodeDisassembler mechanism
teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 04 Jul 2012 21:57:49 +0200 |
parents | bf864f701a4a |
children | d2a62e0f25eb |
rev | line source |
---|---|
0 | 1 /* |
2426
1d1603768966
7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents:
2177
diff
changeset
|
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1089
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1089
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1089
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" | |
27 #include "classfile/vmSymbols.hpp" | |
28 #include "oops/oop.inline.hpp" | |
29 #include "runtime/handles.inline.hpp" | |
30 #include "runtime/javaCalls.hpp" | |
31 #include "services/lowMemoryDetector.hpp" | |
32 #include "services/management.hpp" | |
33 #include "services/memoryManager.hpp" | |
34 #include "services/memoryPool.hpp" | |
35 #include "services/memoryService.hpp" | |
3356
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
2426
diff
changeset
|
36 #include "services/gcNotifier.hpp" |
1972 | 37 #include "utilities/dtrace.hpp" |
0 | 38 |
4006 | 39 #ifndef USDT2 |
0 | 40 HS_DTRACE_PROBE_DECL8(hotspot, mem__pool__gc__begin, char*, int, char*, int, |
41 size_t, size_t, size_t, size_t); | |
42 HS_DTRACE_PROBE_DECL8(hotspot, mem__pool__gc__end, char*, int, char*, int, | |
43 size_t, size_t, size_t, size_t); | |
4006 | 44 #endif /* !USDT2 */ |
0 | 45 |
46 MemoryManager::MemoryManager() { | |
47 _num_pools = 0; | |
48 _memory_mgr_obj = NULL; | |
49 } | |
50 | |
51 void MemoryManager::add_pool(MemoryPool* pool) { | |
52 assert(_num_pools < MemoryManager::max_num_pools, "_num_pools exceeds the max"); | |
53 if (_num_pools < MemoryManager::max_num_pools) { | |
54 _pools[_num_pools] = pool; | |
55 _num_pools++; | |
56 } | |
57 pool->add_manager(this); | |
58 } | |
59 | |
60 MemoryManager* MemoryManager::get_code_cache_memory_manager() { | |
61 return (MemoryManager*) new CodeCacheMemoryManager(); | |
62 } | |
63 | |
64 GCMemoryManager* MemoryManager::get_copy_memory_manager() { | |
65 return (GCMemoryManager*) new CopyMemoryManager(); | |
66 } | |
67 | |
68 GCMemoryManager* MemoryManager::get_msc_memory_manager() { | |
69 return (GCMemoryManager*) new MSCMemoryManager(); | |
70 } | |
71 | |
72 GCMemoryManager* MemoryManager::get_parnew_memory_manager() { | |
73 return (GCMemoryManager*) new ParNewMemoryManager(); | |
74 } | |
75 | |
76 GCMemoryManager* MemoryManager::get_cms_memory_manager() { | |
77 return (GCMemoryManager*) new CMSMemoryManager(); | |
78 } | |
79 | |
80 GCMemoryManager* MemoryManager::get_psScavenge_memory_manager() { | |
81 return (GCMemoryManager*) new PSScavengeMemoryManager(); | |
82 } | |
83 | |
84 GCMemoryManager* MemoryManager::get_psMarkSweep_memory_manager() { | |
85 return (GCMemoryManager*) new PSMarkSweepMemoryManager(); | |
86 } | |
87 | |
1089
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
88 GCMemoryManager* MemoryManager::get_g1YoungGen_memory_manager() { |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
89 return (GCMemoryManager*) new G1YoungGenMemoryManager(); |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
90 } |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
91 |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
92 GCMemoryManager* MemoryManager::get_g1OldGen_memory_manager() { |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
93 return (GCMemoryManager*) new G1OldGenMemoryManager(); |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
94 } |
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
0
diff
changeset
|
95 |
0 | 96 instanceOop MemoryManager::get_memory_manager_instance(TRAPS) { |
97 // Must do an acquire so as to force ordering of subsequent | |
98 // loads from anything _memory_mgr_obj points to or implies. | |
99 instanceOop mgr_obj = (instanceOop)OrderAccess::load_ptr_acquire(&_memory_mgr_obj); | |
100 if (mgr_obj == NULL) { | |
101 // It's ok for more than one thread to execute the code up to the locked region. | |
102 // Extra manager instances will just be gc'ed. | |
103 klassOop k = Management::sun_management_ManagementFactory_klass(CHECK_0); | |
104 instanceKlassHandle ik(THREAD, k); | |
105 | |
106 Handle mgr_name = java_lang_String::create_from_str(name(), CHECK_0); | |
107 | |
108 JavaValue result(T_OBJECT); | |
109 JavaCallArguments args; | |
110 args.push_oop(mgr_name); // Argument 1 | |
111 | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
112 Symbol* method_name = NULL; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
113 Symbol* signature = NULL; |
0 | 114 if (is_gc_memory_manager()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
115 method_name = vmSymbols::createGarbageCollector_name(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
116 signature = vmSymbols::createGarbageCollector_signature(); |
0 | 117 args.push_oop(Handle()); // Argument 2 (for future extension) |
118 } else { | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
119 method_name = vmSymbols::createMemoryManager_name(); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
120 signature = vmSymbols::createMemoryManager_signature(); |
0 | 121 } |
122 | |
123 JavaCalls::call_static(&result, | |
124 ik, | |
125 method_name, | |
126 signature, | |
127 &args, | |
128 CHECK_0); | |
129 | |
130 instanceOop m = (instanceOop) result.get_jobject(); | |
131 instanceHandle mgr(THREAD, m); | |
132 | |
133 { | |
134 // Get lock before setting _memory_mgr_obj | |
135 // since another thread may have created the instance | |
136 MutexLocker ml(Management_lock); | |
137 | |
138 // Check if another thread has created the management object. We reload | |
139 // _memory_mgr_obj here because some other thread may have initialized | |
140 // it while we were executing the code before the lock. | |
141 // | |
142 // The lock has done an acquire, so the load can't float above it, but | |
143 // we need to do a load_acquire as above. | |
144 mgr_obj = (instanceOop)OrderAccess::load_ptr_acquire(&_memory_mgr_obj); | |
145 if (mgr_obj != NULL) { | |
146 return mgr_obj; | |
147 } | |
148 | |
149 // Get the address of the object we created via call_special. | |
150 mgr_obj = mgr(); | |
151 | |
152 // Use store barrier to make sure the memory accesses associated | |
153 // with creating the management object are visible before publishing | |
154 // its address. The unlock will publish the store to _memory_mgr_obj | |
155 // because it does a release first. | |
156 OrderAccess::release_store_ptr(&_memory_mgr_obj, mgr_obj); | |
157 } | |
158 } | |
159 | |
160 return mgr_obj; | |
161 } | |
162 | |
163 void MemoryManager::oops_do(OopClosure* f) { | |
164 f->do_oop((oop*) &_memory_mgr_obj); | |
165 } | |
166 | |
167 GCStatInfo::GCStatInfo(int num_pools) { | |
168 // initialize the arrays for memory usage | |
169 _before_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools); | |
170 _after_gc_usage_array = (MemoryUsage*) NEW_C_HEAP_ARRAY(MemoryUsage, num_pools); | |
171 _usage_array_size = num_pools; | |
4092
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
172 clear(); |
0 | 173 } |
174 | |
175 GCStatInfo::~GCStatInfo() { | |
176 FREE_C_HEAP_ARRAY(MemoryUsage*, _before_gc_usage_array); | |
177 FREE_C_HEAP_ARRAY(MemoryUsage*, _after_gc_usage_array); | |
178 } | |
179 | |
180 void GCStatInfo::set_gc_usage(int pool_index, MemoryUsage usage, bool before_gc) { | |
181 MemoryUsage* gc_usage_array; | |
182 if (before_gc) { | |
183 gc_usage_array = _before_gc_usage_array; | |
184 } else { | |
185 gc_usage_array = _after_gc_usage_array; | |
186 } | |
187 gc_usage_array[pool_index] = usage; | |
188 } | |
189 | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
190 void GCStatInfo::clear() { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
191 _index = 0; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
192 _start_time = 0L; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
193 _end_time = 0L; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
194 size_t len = _usage_array_size * sizeof(MemoryUsage); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
195 memset(_before_gc_usage_array, 0, len); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
196 memset(_after_gc_usage_array, 0, len); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
197 } |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
198 |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
199 |
0 | 200 GCMemoryManager::GCMemoryManager() : MemoryManager() { |
201 _num_collections = 0; | |
202 _last_gc_stat = NULL; | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
203 _last_gc_lock = new Mutex(Mutex::leaf, "_last_gc_lock", true); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
204 _current_gc_stat = NULL; |
0 | 205 _num_gc_threads = 1; |
3356
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
2426
diff
changeset
|
206 _notification_enabled = false; |
0 | 207 } |
208 | |
209 GCMemoryManager::~GCMemoryManager() { | |
210 delete _last_gc_stat; | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
211 delete _last_gc_lock; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
212 delete _current_gc_stat; |
0 | 213 } |
214 | |
215 void GCMemoryManager::initialize_gc_stat_info() { | |
216 assert(MemoryService::num_memory_pools() > 0, "should have one or more memory pools"); | |
4844
bf864f701a4a
7066129: GarbageCollectorMXBean#getLastGcInfo leaks native memory
dsamersoff
parents:
4092
diff
changeset
|
217 _last_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools()); |
bf864f701a4a
7066129: GarbageCollectorMXBean#getLastGcInfo leaks native memory
dsamersoff
parents:
4092
diff
changeset
|
218 _current_gc_stat = new(ResourceObj::C_HEAP) GCStatInfo(MemoryService::num_memory_pools()); |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
219 // tracking concurrent collections we need two objects: one to update, and one to |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
220 // hold the publicly available "last (completed) gc" information. |
0 | 221 } |
222 | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
223 void GCMemoryManager::gc_begin(bool recordGCBeginTime, bool recordPreGCUsage, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
224 bool recordAccumulatedGCTime) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
225 assert(_last_gc_stat != NULL && _current_gc_stat != NULL, "Just checking"); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
226 if (recordAccumulatedGCTime) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
227 _accumulated_timer.start(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
228 } |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
229 // _num_collections now increases in gc_end, to count completed collections |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
230 if (recordGCBeginTime) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
231 _current_gc_stat->set_index(_num_collections+1); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
232 _current_gc_stat->set_start_time(Management::timestamp()); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
233 } |
0 | 234 |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
235 if (recordPreGCUsage) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
236 // Keep memory usage of all memory pools |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
237 for (int i = 0; i < MemoryService::num_memory_pools(); i++) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
238 MemoryPool* pool = MemoryService::get_memory_pool(i); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
239 MemoryUsage usage = pool->get_memory_usage(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
240 _current_gc_stat->set_before_gc_usage(i, usage); |
4006 | 241 #ifndef USDT2 |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
242 HS_DTRACE_PROBE8(hotspot, mem__pool__gc__begin, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
243 name(), strlen(name()), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
244 pool->name(), strlen(pool->name()), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
245 usage.init_size(), usage.used(), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
246 usage.committed(), usage.max_size()); |
4006 | 247 #else /* USDT2 */ |
248 HOTSPOT_MEM_POOL_GC_BEGIN( | |
249 (char *) name(), strlen(name()), | |
250 (char *) pool->name(), strlen(pool->name()), | |
251 usage.init_size(), usage.used(), | |
252 usage.committed(), usage.max_size()); | |
253 #endif /* USDT2 */ | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
254 } |
0 | 255 } |
256 } | |
257 | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
258 // A collector MUST, even if it does not complete for some reason, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
259 // make a TraceMemoryManagerStats object where countCollection is true, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
260 // to ensure the current gc stat is placed in _last_gc_stat. |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
261 void GCMemoryManager::gc_end(bool recordPostGCUsage, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
262 bool recordAccumulatedGCTime, |
3356
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
2426
diff
changeset
|
263 bool recordGCEndTime, bool countCollection, |
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
2426
diff
changeset
|
264 GCCause::Cause cause) { |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
265 if (recordAccumulatedGCTime) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
266 _accumulated_timer.stop(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
267 } |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
268 if (recordGCEndTime) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
269 _current_gc_stat->set_end_time(Management::timestamp()); |
0 | 270 } |
271 | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
272 if (recordPostGCUsage) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
273 int i; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
274 // keep the last gc statistics for all memory pools |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
275 for (i = 0; i < MemoryService::num_memory_pools(); i++) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
276 MemoryPool* pool = MemoryService::get_memory_pool(i); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
277 MemoryUsage usage = pool->get_memory_usage(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
278 |
4006 | 279 #ifndef USDT2 |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
280 HS_DTRACE_PROBE8(hotspot, mem__pool__gc__end, |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
281 name(), strlen(name()), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
282 pool->name(), strlen(pool->name()), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
283 usage.init_size(), usage.used(), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
284 usage.committed(), usage.max_size()); |
4006 | 285 #else /* USDT2 */ |
286 HOTSPOT_MEM_POOL_GC_END( | |
287 (char *) name(), strlen(name()), | |
288 (char *) pool->name(), strlen(pool->name()), | |
289 usage.init_size(), usage.used(), | |
290 usage.committed(), usage.max_size()); | |
291 #endif /* USDT2 */ | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
292 |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
293 _current_gc_stat->set_after_gc_usage(i, usage); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
294 } |
0 | 295 |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
296 // Set last collection usage of the memory pools managed by this collector |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
297 for (i = 0; i < num_memory_pools(); i++) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
298 MemoryPool* pool = get_memory_pool(i); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
299 MemoryUsage usage = pool->get_memory_usage(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
300 |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
301 // Compare with GC usage threshold |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
302 pool->set_last_collection_usage(usage); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
303 LowMemoryDetector::detect_after_gc_memory(pool); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
304 } |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
305 } |
4092
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
306 |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
307 if (countCollection) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
308 _num_collections++; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
309 // alternately update two objects making one public when complete |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
310 { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
311 MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
312 GCStatInfo *tmp = _last_gc_stat; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
313 _last_gc_stat = _current_gc_stat; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
314 _current_gc_stat = tmp; |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
315 // reset the current stat for diagnosability purposes |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
316 _current_gc_stat->clear(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
317 } |
4092
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
318 |
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
319 if (is_notification_enabled()) { |
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
320 bool isMajorGC = this == MemoryService::get_major_gc_manager(); |
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
321 GCNotifier::pushNotification(this, isMajorGC ? "end of major GC" : "end of minor GC", |
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
322 GCCause::to_string(cause)); |
b5a5f30c483d
7110173: GCNotifier::pushNotification publishes stale data.
johnc
parents:
4006
diff
changeset
|
323 } |
0 | 324 } |
325 } | |
1703
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
326 |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
327 size_t GCMemoryManager::get_last_gc_stat(GCStatInfo* dest) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
328 MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
329 if (_last_gc_stat->gc_index() != 0) { |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
330 dest->set_index(_last_gc_stat->gc_index()); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
331 dest->set_start_time(_last_gc_stat->start_time()); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
332 dest->set_end_time(_last_gc_stat->end_time()); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
333 assert(dest->usage_array_size() == _last_gc_stat->usage_array_size(), |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
334 "Must have same array size"); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
335 size_t len = dest->usage_array_size() * sizeof(MemoryUsage); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
336 memcpy(dest->before_gc_usage_array(), _last_gc_stat->before_gc_usage_array(), len); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
337 memcpy(dest->after_gc_usage_array(), _last_gc_stat->after_gc_usage_array(), len); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
338 } |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
339 return _last_gc_stat->gc_index(); |
f6f3eef8a521
6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents:
1552
diff
changeset
|
340 } |