1 /*
   2  * Copyright 2001-2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  *
  23  */
  24 
  25 #include "incls/_precompiled.incl"
  26 #include "incls/_genMarkSweep.cpp.incl"
  27 
  28 void GenMarkSweep::invoke_at_safepoint(int level, ReferenceProcessor* rp,
  29   bool clear_all_softrefs) {
  30   assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
  31 
  32   // hook up weak ref data so it can be used during Mark-Sweep
  33   assert(ref_processor() == NULL, "no stomping");
  34   _ref_processor = rp;
  35   assert(rp != NULL, "should be non-NULL");
  36 
  37   TraceTime t1("Full GC", PrintGC && !PrintGCDetails, true, gclog_or_tty);
  38 
  39   // When collecting the permanent generation methodOops may be moving,
  40   // so we either have to flush all bcp data or convert it into bci.
  41   CodeCache::gc_prologue();
  42   Threads::gc_prologue();
  43 
  44   // Increment the invocation count for the permanent generation, since it is
  45   // implicitly collected whenever we do a full mark sweep collection.
  46   GenCollectedHeap* gch = GenCollectedHeap::heap();
  47   gch->perm_gen()->stat_record()->invocations++;
  48 
  49   // Capture heap size before collection for printing.
  50   size_t gch_prev_used = gch->used();
  51 
  52   // Some of the card table updates below assume that the perm gen is
  53   // also being collected.
  54   assert(level == gch->n_gens() - 1,
  55          "All generations are being collected, ergo perm gen too.");
  56 
  57   // Capture used regions for each generation that will be
  58   // subject to collection, so that card table adjustments can
  59   // be made intelligently (see clear / invalidate further below).
  60   gch->save_used_regions(level, true /* perm */);
  61 
  62   allocate_stacks();
  63 
  64   mark_sweep_phase1(level, clear_all_softrefs);
  65 
  66   mark_sweep_phase2();
  67 
  68   // Don't add any more derived pointers during phase3
  69   COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
  70   COMPILER2_PRESENT(DerivedPointerTable::set_active(false));
  71 
  72   mark_sweep_phase3(level);
  73 
  74   VALIDATE_MARK_SWEEP_ONLY(
  75     if (ValidateMarkSweep) {
  76       guarantee(_root_refs_stack->length() == 0, "should be empty by now");
  77     }
  78   )
  79 
  80   mark_sweep_phase4();
  81 
  82   VALIDATE_MARK_SWEEP_ONLY(
  83     if (ValidateMarkSweep) {
  84       guarantee(_live_oops->length() == _live_oops_moved_to->length(),
  85                 "should be the same size");
  86     }
  87   )
  88 
  89   restore_marks();
  90 
  91   // Set saved marks for allocation profiler (and other things? -- dld)
  92   // (Should this be in general part?)
  93   gch->save_marks();
  94 
  95   deallocate_stacks();
  96 
  97   // If compaction completely evacuated all generations younger than this
  98   // one, then we can clear the card table.  Otherwise, we must invalidate
  99   // it (consider all cards dirty).  In the future, we might consider doing
 100   // compaction within generations only, and doing card-table sliding.
 101   bool all_empty = true;
 102   for (int i = 0; all_empty && i < level; i++) {
 103     Generation* g = gch->get_gen(i);
 104     all_empty = all_empty && gch->get_gen(i)->used() == 0;
 105   }
 106   GenRemSet* rs = gch->rem_set();
 107   // Clear/invalidate below make use of the "prev_used_regions" saved earlier.
 108   if (all_empty) {
 109     // We've evacuated all generations below us.
 110     Generation* g = gch->get_gen(level);
 111     rs->clear_into_younger(g, true /* perm */);
 112   } else {
 113     // Invalidate the cards corresponding to the currently used
 114     // region and clear those corresponding to the evacuated region
 115     // of all generations just collected (i.e. level and younger).
 116     rs->invalidate_or_clear(gch->get_gen(level),
 117                             true /* younger */,
 118                             true /* perm */);
 119   }
 120 
 121   Threads::gc_epilogue();
 122   CodeCache::gc_epilogue();
 123 
 124   if (PrintGC && !PrintGCDetails) {
 125     gch->print_heap_change(gch_prev_used);
 126   }
 127 
 128   // refs processing: clean slate
 129   _ref_processor = NULL;
 130 
 131   // Update heap occupancy information which is used as
 132   // input to soft ref clearing policy at the next gc.
 133   Universe::update_heap_info_at_gc();
 134 
 135   // Update time of last gc for all generations we collected
 136   // (which curently is all the generations in the heap).
 137   gch->update_time_of_last_gc(os::javaTimeMillis());
 138 }
 139 
 140 void GenMarkSweep::allocate_stacks() {
 141   GenCollectedHeap* gch = GenCollectedHeap::heap();
 142   // Scratch request on behalf of oldest generation; will do no
 143   // allocation.
 144   ScratchBlock* scratch = gch->gather_scratch(gch->_gens[gch->_n_gens-1], 0);
 145 
 146   // $$$ To cut a corner, we'll only use the first scratch block, and then
 147   // revert to malloc.
 148   if (scratch != NULL) {
 149     _preserved_count_max =
 150       scratch->num_words * HeapWordSize / sizeof(PreservedMark);
 151   } else {
 152     _preserved_count_max = 0;
 153   }
 154 
 155   _preserved_marks = (PreservedMark*)scratch;
 156   _preserved_count = 0;
 157   _preserved_mark_stack = NULL;
 158   _preserved_oop_stack = NULL;
 159 
 160   _marking_stack       = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true);
 161 
 162   int size = SystemDictionary::number_of_classes() * 2;
 163   _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
 164 
 165 #ifdef VALIDATE_MARK_SWEEP
 166   if (ValidateMarkSweep) {
 167     _root_refs_stack    = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
 168     _other_refs_stack   = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
 169     _adjusted_pointers  = new (ResourceObj::C_HEAP) GrowableArray<void*>(100, true);
 170     _live_oops          = new (ResourceObj::C_HEAP) GrowableArray<oop>(100, true);
 171     _live_oops_moved_to = new (ResourceObj::C_HEAP) GrowableArray<oop>(100, true);
 172     _live_oops_size     = new (ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
 173   }
 174   if (RecordMarkSweepCompaction) {
 175     if (_cur_gc_live_oops == NULL) {
 176       _cur_gc_live_oops           = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
 177       _cur_gc_live_oops_moved_to  = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
 178       _cur_gc_live_oops_size      = new(ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
 179       _last_gc_live_oops          = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
 180       _last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP) GrowableArray<HeapWord*>(100, true);
 181       _last_gc_live_oops_size     = new(ResourceObj::C_HEAP) GrowableArray<size_t>(100, true);
 182     } else {
 183       _cur_gc_live_oops->clear();
 184       _cur_gc_live_oops_moved_to->clear();
 185       _cur_gc_live_oops_size->clear();
 186     }
 187   }
 188 #endif
 189 }
 190 
 191 
 192 void GenMarkSweep::deallocate_stacks() {
 193 
 194   if (!UseG1GC) {
 195     GenCollectedHeap* gch = GenCollectedHeap::heap();
 196     gch->release_scratch();
 197   }
 198 
 199   if (_preserved_oop_stack) {
 200     delete _preserved_mark_stack;
 201     _preserved_mark_stack = NULL;
 202     delete _preserved_oop_stack;
 203     _preserved_oop_stack = NULL;
 204   }
 205 
 206   delete _marking_stack;
 207   delete _revisit_klass_stack;
 208 
 209 #ifdef VALIDATE_MARK_SWEEP
 210   if (ValidateMarkSweep) {
 211     delete _root_refs_stack;
 212     delete _other_refs_stack;
 213     delete _adjusted_pointers;
 214     delete _live_oops;
 215     delete _live_oops_size;
 216     delete _live_oops_moved_to;
 217     _live_oops_index = 0;
 218     _live_oops_index_at_perm = 0;
 219   }
 220 #endif
 221 }
 222 
 223 void GenMarkSweep::mark_sweep_phase1(int level,
 224                                   bool clear_all_softrefs) {
 225   // Recursively traverse all live objects and mark them
 226   EventMark m("1 mark object");
 227   TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty);
 228   trace(" 1");
 229 
 230   VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
 231 
 232   GenCollectedHeap* gch = GenCollectedHeap::heap();
 233 
 234   // Because follow_root_closure is created statically, cannot
 235   // use OopsInGenClosure constructor which takes a generation,
 236   // as the Universe has not been created when the static constructors
 237   // are run.
 238   follow_root_closure.set_orig_generation(gch->get_gen(level));
 239 
 240   gch->gen_process_strong_roots(level,
 241                                 false, // Younger gens are not roots.
 242                                 true,  // Collecting permanent generation.
 243                                 SharedHeap::SO_SystemClasses,
 244                                 &follow_root_closure, &follow_root_closure);
 245 
 246   // Process reference objects found during marking
 247   {
 248     ReferencePolicy *soft_ref_policy;
 249     if (clear_all_softrefs) {
 250       soft_ref_policy = new AlwaysClearPolicy();
 251     } else {
 252 #ifdef COMPILER2
 253       soft_ref_policy = new LRUMaxHeapPolicy();
 254 #else
 255       soft_ref_policy = new LRUCurrentHeapPolicy();
 256 #endif // COMPILER2
 257     }
 258     assert(soft_ref_policy != NULL,"No soft reference policy");
 259     ref_processor()->process_discovered_references(
 260       soft_ref_policy, &is_alive, &keep_alive,
 261       &follow_stack_closure, NULL);
 262   }
 263 
 264   // Follow system dictionary roots and unload classes
 265   bool purged_class = SystemDictionary::do_unloading(&is_alive);
 266 
 267   // Follow code cache roots
 268   CodeCache::do_unloading(&is_alive, &keep_alive, purged_class);
 269   follow_stack(); // Flush marking stack
 270 
 271   // Update subklass/sibling/implementor links of live klasses
 272   follow_weak_klass_links();
 273   assert(_marking_stack->is_empty(), "just drained");
 274 
 275   // Visit symbol and interned string tables and delete unmarked oops
 276   SymbolTable::unlink(&is_alive);
 277   StringTable::unlink(&is_alive);
 278 
 279   assert(_marking_stack->is_empty(), "stack should be empty by now");
 280 }
 281 
 282 
 283 void GenMarkSweep::mark_sweep_phase2() {
 284   // Now all live objects are marked, compute the new object addresses.
 285 
 286   // It is imperative that we traverse perm_gen LAST. If dead space is
 287   // allowed a range of dead object may get overwritten by a dead int
 288   // array. If perm_gen is not traversed last a klassOop may get
 289   // overwritten. This is fine since it is dead, but if the class has dead
 290   // instances we have to skip them, and in order to find their size we
 291   // need the klassOop!
 292   //
 293   // It is not required that we traverse spaces in the same order in
 294   // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
 295   // tracking expects us to do so. See comment under phase4.
 296 
 297   GenCollectedHeap* gch = GenCollectedHeap::heap();
 298   Generation* pg = gch->perm_gen();
 299 
 300   EventMark m("2 compute new addresses");
 301   TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty);
 302   trace("2");
 303 
 304   VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
 305 
 306   gch->prepare_for_compaction();
 307 
 308   VALIDATE_MARK_SWEEP_ONLY(_live_oops_index_at_perm = _live_oops_index);
 309   CompactPoint perm_cp(pg, NULL, NULL);
 310   pg->prepare_for_compaction(&perm_cp);
 311 }
 312 
 313 class GenAdjustPointersClosure: public GenCollectedHeap::GenClosure {
 314 public:
 315   void do_generation(Generation* gen) {
 316     gen->adjust_pointers();
 317   }
 318 };
 319 
 320 void GenMarkSweep::mark_sweep_phase3(int level) {
 321   GenCollectedHeap* gch = GenCollectedHeap::heap();
 322   Generation* pg = gch->perm_gen();
 323 
 324   // Adjust the pointers to reflect the new locations
 325   EventMark m("3 adjust pointers");
 326   TraceTime tm("phase 3", PrintGC && Verbose, true, gclog_or_tty);
 327   trace("3");
 328 
 329   VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
 330 
 331   // Needs to be done before the system dictionary is adjusted.
 332   pg->pre_adjust_pointers();
 333 
 334   // Because the two closures below are created statically, cannot
 335   // use OopsInGenClosure constructor which takes a generation,
 336   // as the Universe has not been created when the static constructors
 337   // are run.
 338   adjust_root_pointer_closure.set_orig_generation(gch->get_gen(level));
 339   adjust_pointer_closure.set_orig_generation(gch->get_gen(level));
 340 
 341   gch->gen_process_strong_roots(level,
 342                                 false, // Younger gens are not roots.
 343                                 true,  // Collecting permanent generation.
 344                                 SharedHeap::SO_AllClasses,
 345                                 &adjust_root_pointer_closure,
 346                                 &adjust_root_pointer_closure);
 347 
 348   // Now adjust pointers in remaining weak roots.  (All of which should
 349   // have been cleared if they pointed to non-surviving objects.)
 350   gch->gen_process_weak_roots(&adjust_root_pointer_closure,
 351                               &adjust_pointer_closure);
 352 
 353   adjust_marks();
 354   GenAdjustPointersClosure blk;
 355   gch->generation_iterate(&blk, true);
 356   pg->adjust_pointers();
 357 }
 358 
 359 class GenCompactClosure: public GenCollectedHeap::GenClosure {
 360 public:
 361   void do_generation(Generation* gen) {
 362     gen->compact();
 363   }
 364 };
 365 
 366 void GenMarkSweep::mark_sweep_phase4() {
 367   // All pointers are now adjusted, move objects accordingly
 368 
 369   // It is imperative that we traverse perm_gen first in phase4. All
 370   // classes must be allocated earlier than their instances, and traversing
 371   // perm_gen first makes sure that all klassOops have moved to their new
 372   // location before any instance does a dispatch through it's klass!
 373 
 374   // The ValidateMarkSweep live oops tracking expects us to traverse spaces
 375   // in the same order in phase2, phase3 and phase4. We don't quite do that
 376   // here (perm_gen first rather than last), so we tell the validate code
 377   // to use a higher index (saved from phase2) when verifying perm_gen.
 378   GenCollectedHeap* gch = GenCollectedHeap::heap();
 379   Generation* pg = gch->perm_gen();
 380 
 381   EventMark m("4 compact heap");
 382   TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty);
 383   trace("4");
 384 
 385   VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(true));
 386 
 387   pg->compact();
 388 
 389   VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
 390 
 391   GenCompactClosure blk;
 392   gch->generation_iterate(&blk, true);
 393 
 394   VALIDATE_MARK_SWEEP_ONLY(compaction_complete());
 395 
 396   pg->post_compact(); // Shared spaces verification.
 397 }