1 /* 2 * Copyright (c) 2000, 2010, 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 "incls/_precompiled.incl" 26 # include "incls/_sharedHeap.cpp.incl" 27 28 SharedHeap* SharedHeap::_sh; 29 30 // The set of potentially parallel tasks in strong root scanning. 31 enum SH_process_strong_roots_tasks { 32 SH_PS_Universe_oops_do, 33 SH_PS_JNIHandles_oops_do, 34 SH_PS_ObjectSynchronizer_oops_do, 35 SH_PS_FlatProfiler_oops_do, 36 SH_PS_Management_oops_do, 37 SH_PS_SystemDictionary_oops_do, 38 SH_PS_jvmti_oops_do, 39 SH_PS_vmSymbols_oops_do, 40 SH_PS_SymbolTable_oops_do, 41 SH_PS_StringTable_oops_do, 42 SH_PS_CodeCache_oops_do, 43 // Leave this one last. 44 SH_PS_NumElements 45 }; 46 47 SharedHeap::SharedHeap(CollectorPolicy* policy_) : 48 CollectedHeap(), 49 _collector_policy(policy_), 50 _perm_gen(NULL), _rem_set(NULL), 51 _strong_roots_parity(0), 52 _process_strong_tasks(new SubTasksDone(SH_PS_NumElements)), 53 _n_par_threads(0), 54 _workers(NULL) 55 { 56 if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) { 57 vm_exit_during_initialization("Failed necessary allocation."); 58 } 59 _sh = this; // ch is static, should be set only once. 60 if ((UseParNewGC || 61 (UseConcMarkSweepGC && CMSParallelRemarkEnabled) || 62 UseG1GC) && 63 ParallelGCThreads > 0) { 64 _workers = new FlexibleWorkGang("Parallel GC Threads", ParallelGCThreads, 65 /* are_GC_task_threads */true, 66 /* are_ConcurrentGC_threads */false); 67 if (_workers == NULL) { 68 vm_exit_during_initialization("Failed necessary allocation."); 69 } else { 70 _workers->initialize_workers(); 71 } 72 } 73 } 74 75 bool SharedHeap::heap_lock_held_for_gc() { 76 Thread* t = Thread::current(); 77 return Heap_lock->owned_by_self() 78 || ( (t->is_GC_task_thread() || t->is_VM_thread()) 79 && _thread_holds_heap_lock_for_gc); 80 } 81 82 void SharedHeap::set_par_threads(int t) { 83 assert(t == 0 || !UseSerialGC, "Cannot have parallel threads"); 84 _n_par_threads = t; 85 _process_strong_tasks->set_n_threads(t); 86 } 87 88 class AssertIsPermClosure: public OopClosure { 89 public: 90 virtual void do_oop(oop* p) { 91 assert((*p) == NULL || (*p)->is_perm(), "Referent should be perm."); 92 } 93 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } 94 }; 95 static AssertIsPermClosure assert_is_perm_closure; 96 97 void SharedHeap::change_strong_roots_parity() { 98 // Also set the new collection parity. 99 assert(_strong_roots_parity >= 0 && _strong_roots_parity <= 2, 100 "Not in range."); 101 _strong_roots_parity++; 102 if (_strong_roots_parity == 3) _strong_roots_parity = 1; 103 assert(_strong_roots_parity >= 1 && _strong_roots_parity <= 2, 104 "Not in range."); 105 } 106 107 SharedHeap::StrongRootsScope::StrongRootsScope(SharedHeap* outer, bool activate) 108 : MarkScope(activate) 109 { 110 if (_active) { 111 outer->change_strong_roots_parity(); 112 } 113 } 114 115 SharedHeap::StrongRootsScope::~StrongRootsScope() { 116 // nothing particular 117 } 118 119 void SharedHeap::process_strong_roots(bool activate_scope, 120 bool collecting_perm_gen, 121 ScanningOption so, 122 OopClosure* roots, 123 CodeBlobClosure* code_roots, 124 OopsInGenClosure* perm_blk) { 125 StrongRootsScope srs(this, activate_scope); 126 // General strong roots. 127 assert(_strong_roots_parity != 0, "must have called prologue code"); 128 if (!_process_strong_tasks->is_task_claimed(SH_PS_Universe_oops_do)) { 129 Universe::oops_do(roots); 130 ReferenceProcessor::oops_do(roots); 131 // Consider perm-gen discovered lists to be strong. 132 perm_gen()->ref_processor()->weak_oops_do(roots); 133 } 134 // Global (strong) JNI handles 135 if (!_process_strong_tasks->is_task_claimed(SH_PS_JNIHandles_oops_do)) 136 JNIHandles::oops_do(roots); 137 // All threads execute this; the individual threads are task groups. 138 if (ParallelGCThreads > 0) { 139 Threads::possibly_parallel_oops_do(roots, code_roots); 140 } else { 141 Threads::oops_do(roots, code_roots); 142 } 143 if (!_process_strong_tasks-> is_task_claimed(SH_PS_ObjectSynchronizer_oops_do)) 144 ObjectSynchronizer::oops_do(roots); 145 if (!_process_strong_tasks->is_task_claimed(SH_PS_FlatProfiler_oops_do)) 146 FlatProfiler::oops_do(roots); 147 if (!_process_strong_tasks->is_task_claimed(SH_PS_Management_oops_do)) 148 Management::oops_do(roots); 149 if (!_process_strong_tasks->is_task_claimed(SH_PS_jvmti_oops_do)) 150 JvmtiExport::oops_do(roots); 151 152 if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) { 153 if (so & SO_AllClasses) { 154 SystemDictionary::oops_do(roots); 155 } else 156 if (so & SO_SystemClasses) { 157 SystemDictionary::always_strong_oops_do(roots); 158 } 159 } 160 161 if (!_process_strong_tasks->is_task_claimed(SH_PS_SymbolTable_oops_do)) { 162 if (so & SO_Symbols) { 163 SymbolTable::oops_do(roots); 164 } 165 // Verify if the symbol table contents are in the perm gen 166 NOT_PRODUCT(SymbolTable::oops_do(&assert_is_perm_closure)); 167 } 168 169 if (!_process_strong_tasks->is_task_claimed(SH_PS_StringTable_oops_do)) { 170 if (so & SO_Strings) { 171 StringTable::oops_do(roots); 172 } 173 // Verify if the string table contents are in the perm gen 174 NOT_PRODUCT(StringTable::oops_do(&assert_is_perm_closure)); 175 } 176 177 if (!_process_strong_tasks->is_task_claimed(SH_PS_CodeCache_oops_do)) { 178 if (so & SO_CodeCache) { 179 // (Currently, CMSCollector uses this to do intermediate-strength collections.) 180 assert(collecting_perm_gen, "scanning all of code cache"); 181 assert(code_roots != NULL, "must supply closure for code cache"); 182 if (code_roots != NULL) { 183 CodeCache::blobs_do(code_roots); 184 } 185 } else if (so & (SO_SystemClasses|SO_AllClasses)) { 186 if (!collecting_perm_gen) { 187 // If we are collecting from class statics, but we are not going to 188 // visit all of the CodeCache, collect from the non-perm roots if any. 189 // This makes the code cache function temporarily as a source of strong 190 // roots for oops, until the next major collection. 191 // 192 // If collecting_perm_gen is true, we require that this phase will call 193 // CodeCache::do_unloading. This will kill off nmethods with expired 194 // weak references, such as stale invokedynamic targets. 195 CodeCache::scavenge_root_nmethods_do(code_roots); 196 } 197 } 198 // Verify if the code cache contents are in the perm gen 199 NOT_PRODUCT(CodeBlobToOopClosure assert_code_is_perm(&assert_is_perm_closure, /*do_marking=*/ false)); 200 NOT_PRODUCT(CodeCache::asserted_non_scavengable_nmethods_do(&assert_code_is_perm)); 201 } 202 203 // Roots that should point only into permanent generation. 204 { 205 OopClosure* blk = NULL; 206 if (collecting_perm_gen) { 207 blk = roots; 208 } else { 209 debug_only(blk = &assert_is_perm_closure); 210 } 211 if (blk != NULL) { 212 if (!_process_strong_tasks->is_task_claimed(SH_PS_vmSymbols_oops_do)) 213 vmSymbols::oops_do(blk); 214 } 215 } 216 217 if (!collecting_perm_gen) { 218 // All threads perform this; coordination is handled internally. 219 220 rem_set()->younger_refs_iterate(perm_gen(), perm_blk); 221 } 222 _process_strong_tasks->all_tasks_completed(); 223 } 224 225 class AlwaysTrueClosure: public BoolObjectClosure { 226 public: 227 void do_object(oop p) { ShouldNotReachHere(); } 228 bool do_object_b(oop p) { return true; } 229 }; 230 static AlwaysTrueClosure always_true; 231 232 class SkipAdjustingSharedStrings: public OopClosure { 233 OopClosure* _clo; 234 public: 235 SkipAdjustingSharedStrings(OopClosure* clo) : _clo(clo) {} 236 237 virtual void do_oop(oop* p) { 238 oop o = (*p); 239 if (!o->is_shared_readwrite()) { 240 _clo->do_oop(p); 241 } 242 } 243 virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } 244 }; 245 246 // Unmarked shared Strings in the StringTable (which got there due to 247 // being in the constant pools of as-yet unloaded shared classes) were 248 // not marked and therefore did not have their mark words preserved. 249 // These entries are also deliberately not purged from the string 250 // table during unloading of unmarked strings. If an identity hash 251 // code was computed for any of these objects, it will not have been 252 // cleared to zero during the forwarding process or by the 253 // RecursiveAdjustSharedObjectClosure, and will be confused by the 254 // adjusting process as a forwarding pointer. We need to skip 255 // forwarding StringTable entries which contain unmarked shared 256 // Strings. Actually, since shared strings won't be moving, we can 257 // just skip adjusting any shared entries in the string table. 258 259 void SharedHeap::process_weak_roots(OopClosure* root_closure, 260 CodeBlobClosure* code_roots, 261 OopClosure* non_root_closure) { 262 // Global (weak) JNI handles 263 JNIHandles::weak_oops_do(&always_true, root_closure); 264 265 CodeCache::blobs_do(code_roots); 266 SymbolTable::oops_do(root_closure); 267 if (UseSharedSpaces && !DumpSharedSpaces) { 268 SkipAdjustingSharedStrings skip_closure(root_closure); 269 StringTable::oops_do(&skip_closure); 270 } else { 271 StringTable::oops_do(root_closure); 272 } 273 } 274 275 void SharedHeap::set_barrier_set(BarrierSet* bs) { 276 _barrier_set = bs; 277 // Cached barrier set for fast access in oops 278 oopDesc::set_bs(bs); 279 } 280 281 void SharedHeap::post_initialize() { 282 ref_processing_init(); 283 } 284 285 void SharedHeap::ref_processing_init() { 286 perm_gen()->ref_processor_init(); 287 } 288 289 // Some utilities. 290 void SharedHeap::print_size_transition(outputStream* out, 291 size_t bytes_before, 292 size_t bytes_after, 293 size_t capacity) { 294 out->print(" %d%s->%d%s(%d%s)", 295 byte_size_in_proper_unit(bytes_before), 296 proper_unit_for_byte_size(bytes_before), 297 byte_size_in_proper_unit(bytes_after), 298 proper_unit_for_byte_size(bytes_after), 299 byte_size_in_proper_unit(capacity), 300 proper_unit_for_byte_size(capacity)); 301 }