1 /* 2 * Copyright (c) 1997, 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 "precompiled.hpp" 26 #include "compiler/compileBroker.hpp" 27 #include "gc_implementation/shared/markSweep.inline.hpp" 28 #include "gc_interface/collectedHeap.inline.hpp" 29 #include "oops/methodDataOop.hpp" 30 #include "oops/objArrayKlass.inline.hpp" 31 #include "oops/oop.inline.hpp" 32 33 Stack<oop> MarkSweep::_marking_stack; 34 Stack<DataLayout*> MarkSweep::_revisit_mdo_stack; 35 Stack<Klass*> MarkSweep::_revisit_klass_stack; 36 Stack<ObjArrayTask> MarkSweep::_objarray_stack; 37 38 Stack<oop> MarkSweep::_preserved_oop_stack; 39 Stack<markOop> MarkSweep::_preserved_mark_stack; 40 size_t MarkSweep::_preserved_count = 0; 41 size_t MarkSweep::_preserved_count_max = 0; 42 PreservedMark* MarkSweep::_preserved_marks = NULL; 43 ReferenceProcessor* MarkSweep::_ref_processor = NULL; 44 45 #ifdef VALIDATE_MARK_SWEEP 46 GrowableArray<void*>* MarkSweep::_root_refs_stack = NULL; 47 GrowableArray<oop> * MarkSweep::_live_oops = NULL; 48 GrowableArray<oop> * MarkSweep::_live_oops_moved_to = NULL; 49 GrowableArray<size_t>* MarkSweep::_live_oops_size = NULL; 50 size_t MarkSweep::_live_oops_index = 0; 51 size_t MarkSweep::_live_oops_index_at_perm = 0; 52 GrowableArray<void*>* MarkSweep::_other_refs_stack = NULL; 53 GrowableArray<void*>* MarkSweep::_adjusted_pointers = NULL; 54 bool MarkSweep::_pointer_tracking = false; 55 bool MarkSweep::_root_tracking = true; 56 57 GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops = NULL; 58 GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops_moved_to = NULL; 59 GrowableArray<size_t> * MarkSweep::_cur_gc_live_oops_size = NULL; 60 GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops = NULL; 61 GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops_moved_to = NULL; 62 GrowableArray<size_t> * MarkSweep::_last_gc_live_oops_size = NULL; 63 #endif 64 65 void MarkSweep::revisit_weak_klass_link(Klass* k) { 66 _revisit_klass_stack.push(k); 67 } 68 69 void MarkSweep::follow_weak_klass_links() { 70 // All klasses on the revisit stack are marked at this point. 71 // Update and follow all subklass, sibling and implementor links. 72 if (PrintRevisitStats) { 73 gclog_or_tty->print_cr("#classes in system dictionary = %d", 74 SystemDictionary::number_of_classes()); 75 gclog_or_tty->print_cr("Revisit klass stack size = " SIZE_FORMAT, 76 _revisit_klass_stack.size()); 77 } 78 while (!_revisit_klass_stack.is_empty()) { 79 Klass* const k = _revisit_klass_stack.pop(); 80 k->follow_weak_klass_links(&is_alive, &keep_alive); 81 } 82 follow_stack(); 83 } 84 85 void MarkSweep::revisit_mdo(DataLayout* p) { 86 _revisit_mdo_stack.push(p); 87 } 88 89 void MarkSweep::follow_mdo_weak_refs() { 90 // All strongly reachable oops have been marked at this point; 91 // we can visit and clear any weak references from MDO's which 92 // we memoized during the strong marking phase. 93 assert(_marking_stack.is_empty(), "Marking stack should be empty"); 94 if (PrintRevisitStats) { 95 gclog_or_tty->print_cr("#classes in system dictionary = %d", 96 SystemDictionary::number_of_classes()); 97 gclog_or_tty->print_cr("Revisit MDO stack size = " SIZE_FORMAT, 98 _revisit_mdo_stack.size()); 99 } 100 while (!_revisit_mdo_stack.is_empty()) { 101 _revisit_mdo_stack.pop()->follow_weak_refs(&is_alive); 102 } 103 follow_stack(); 104 } 105 106 MarkSweep::FollowRootClosure MarkSweep::follow_root_closure; 107 CodeBlobToOopClosure MarkSweep::follow_code_root_closure(&MarkSweep::follow_root_closure, /*do_marking=*/ true); 108 109 void MarkSweep::FollowRootClosure::do_oop(oop* p) { follow_root(p); } 110 void MarkSweep::FollowRootClosure::do_oop(narrowOop* p) { follow_root(p); } 111 112 MarkSweep::MarkAndPushClosure MarkSweep::mark_and_push_closure; 113 114 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); } 115 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } 116 117 void MarkSweep::follow_stack() { 118 do { 119 while (!_marking_stack.is_empty()) { 120 oop obj = _marking_stack.pop(); 121 assert (obj->is_gc_marked(), "p must be marked"); 122 obj->follow_contents(); 123 } 124 // Process ObjArrays one at a time to avoid marking stack bloat. 125 if (!_objarray_stack.is_empty()) { 126 ObjArrayTask task = _objarray_stack.pop(); 127 objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint(); 128 k->oop_follow_contents(task.obj(), task.index()); 129 } 130 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty()); 131 } 132 133 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; 134 135 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); } 136 137 // We preserve the mark which should be replaced at the end and the location 138 // that it will go. Note that the object that this markOop belongs to isn't 139 // currently at that address but it will be after phase4 140 void MarkSweep::preserve_mark(oop obj, markOop mark) { 141 // We try to store preserved marks in the to space of the new generation since 142 // this is storage which should be available. Most of the time this should be 143 // sufficient space for the marks we need to preserve but if it isn't we fall 144 // back to using Stacks to keep track of the overflow. 145 if (_preserved_count < _preserved_count_max) { 146 _preserved_marks[_preserved_count++].init(obj, mark); 147 } else { 148 _preserved_mark_stack.push(mark); 149 _preserved_oop_stack.push(obj); 150 } 151 } 152 153 MarkSweep::AdjustPointerClosure MarkSweep::adjust_root_pointer_closure(true); 154 MarkSweep::AdjustPointerClosure MarkSweep::adjust_pointer_closure(false); 155 156 void MarkSweep::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p, _is_root); } 157 void MarkSweep::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p, _is_root); } 158 159 void MarkSweep::adjust_marks() { 160 assert( _preserved_oop_stack.size() == _preserved_mark_stack.size(), 161 "inconsistent preserved oop stacks"); 162 163 // adjust the oops we saved earlier 164 for (size_t i = 0; i < _preserved_count; i++) { 165 _preserved_marks[i].adjust_pointer(); 166 } 167 168 // deal with the overflow stack 169 StackIterator<oop> iter(_preserved_oop_stack); 170 while (!iter.is_empty()) { 171 oop* p = iter.next_addr(); 172 adjust_pointer(p); 173 } 174 } 175 176 void MarkSweep::restore_marks() { 177 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(), 178 "inconsistent preserved oop stacks"); 179 if (PrintGC && Verbose) { 180 gclog_or_tty->print_cr("Restoring %d marks", 181 _preserved_count + _preserved_oop_stack.size()); 182 } 183 184 // restore the marks we saved earlier 185 for (size_t i = 0; i < _preserved_count; i++) { 186 _preserved_marks[i].restore(); 187 } 188 189 // deal with the overflow 190 while (!_preserved_oop_stack.is_empty()) { 191 oop obj = _preserved_oop_stack.pop(); 192 markOop mark = _preserved_mark_stack.pop(); 193 obj->set_mark(mark); 194 } 195 } 196 197 #ifdef VALIDATE_MARK_SWEEP 198 199 void MarkSweep::track_adjusted_pointer(void* p, bool isroot) { 200 if (!ValidateMarkSweep) 201 return; 202 203 if (!isroot) { 204 if (_pointer_tracking) { 205 guarantee(_adjusted_pointers->contains(p), "should have seen this pointer"); 206 _adjusted_pointers->remove(p); 207 } 208 } else { 209 ptrdiff_t index = _root_refs_stack->find(p); 210 if (index != -1) { 211 int l = _root_refs_stack->length(); 212 if (l > 0 && l - 1 != index) { 213 void* last = _root_refs_stack->pop(); 214 assert(last != p, "should be different"); 215 _root_refs_stack->at_put(index, last); 216 } else { 217 _root_refs_stack->remove(p); 218 } 219 } 220 } 221 } 222 223 void MarkSweep::check_adjust_pointer(void* p) { 224 _adjusted_pointers->push(p); 225 } 226 227 class AdjusterTracker: public OopClosure { 228 public: 229 AdjusterTracker() {} 230 void do_oop(oop* o) { MarkSweep::check_adjust_pointer(o); } 231 void do_oop(narrowOop* o) { MarkSweep::check_adjust_pointer(o); } 232 }; 233 234 void MarkSweep::track_interior_pointers(oop obj) { 235 if (ValidateMarkSweep) { 236 _adjusted_pointers->clear(); 237 _pointer_tracking = true; 238 239 AdjusterTracker checker; 240 obj->oop_iterate(&checker); 241 } 242 } 243 244 void MarkSweep::check_interior_pointers() { 245 if (ValidateMarkSweep) { 246 _pointer_tracking = false; 247 guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers"); 248 } 249 } 250 251 void MarkSweep::reset_live_oop_tracking(bool at_perm) { 252 if (ValidateMarkSweep) { 253 guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops"); 254 _live_oops_index = at_perm ? _live_oops_index_at_perm : 0; 255 } 256 } 257 258 void MarkSweep::register_live_oop(oop p, size_t size) { 259 if (ValidateMarkSweep) { 260 _live_oops->push(p); 261 _live_oops_size->push(size); 262 _live_oops_index++; 263 } 264 } 265 266 void MarkSweep::validate_live_oop(oop p, size_t size) { 267 if (ValidateMarkSweep) { 268 oop obj = _live_oops->at((int)_live_oops_index); 269 guarantee(obj == p, "should be the same object"); 270 guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size"); 271 _live_oops_index++; 272 } 273 } 274 275 void MarkSweep::live_oop_moved_to(HeapWord* q, size_t size, 276 HeapWord* compaction_top) { 277 assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top), 278 "should be moved to forwarded location"); 279 if (ValidateMarkSweep) { 280 MarkSweep::validate_live_oop(oop(q), size); 281 _live_oops_moved_to->push(oop(compaction_top)); 282 } 283 if (RecordMarkSweepCompaction) { 284 _cur_gc_live_oops->push(q); 285 _cur_gc_live_oops_moved_to->push(compaction_top); 286 _cur_gc_live_oops_size->push(size); 287 } 288 } 289 290 void MarkSweep::compaction_complete() { 291 if (RecordMarkSweepCompaction) { 292 GrowableArray<HeapWord*>* _tmp_live_oops = _cur_gc_live_oops; 293 GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to; 294 GrowableArray<size_t> * _tmp_live_oops_size = _cur_gc_live_oops_size; 295 296 _cur_gc_live_oops = _last_gc_live_oops; 297 _cur_gc_live_oops_moved_to = _last_gc_live_oops_moved_to; 298 _cur_gc_live_oops_size = _last_gc_live_oops_size; 299 _last_gc_live_oops = _tmp_live_oops; 300 _last_gc_live_oops_moved_to = _tmp_live_oops_moved_to; 301 _last_gc_live_oops_size = _tmp_live_oops_size; 302 } 303 } 304 305 void MarkSweep::print_new_location_of_heap_address(HeapWord* q) { 306 if (!RecordMarkSweepCompaction) { 307 tty->print_cr("Requires RecordMarkSweepCompaction to be enabled"); 308 return; 309 } 310 311 if (_last_gc_live_oops == NULL) { 312 tty->print_cr("No compaction information gathered yet"); 313 return; 314 } 315 316 for (int i = 0; i < _last_gc_live_oops->length(); i++) { 317 HeapWord* old_oop = _last_gc_live_oops->at(i); 318 size_t sz = _last_gc_live_oops_size->at(i); 319 if (old_oop <= q && q < (old_oop + sz)) { 320 HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i); 321 size_t offset = (q - old_oop); 322 tty->print_cr("Address " PTR_FORMAT, q); 323 tty->print_cr(" Was in oop " PTR_FORMAT ", size " SIZE_FORMAT ", at offset " SIZE_FORMAT, old_oop, sz, offset); 324 tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset); 325 return; 326 } 327 } 328 329 tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q); 330 } 331 #endif //VALIDATE_MARK_SWEEP 332 333 MarkSweep::IsAliveClosure MarkSweep::is_alive; 334 335 void MarkSweep::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); } 336 bool MarkSweep::IsAliveClosure::do_object_b(oop p) { return p->is_gc_marked(); } 337 338 MarkSweep::KeepAliveClosure MarkSweep::keep_alive; 339 340 void MarkSweep::KeepAliveClosure::do_oop(oop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); } 341 void MarkSweep::KeepAliveClosure::do_oop(narrowOop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); } 342 343 void marksweep_init() { /* empty */ } 344 345 #ifndef PRODUCT 346 347 void MarkSweep::trace(const char* msg) { 348 if (TraceMarkSweep) 349 gclog_or_tty->print("%s", msg); 350 } 351 352 #endif