src/share/vm/memory/genMarkSweep.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/memory/genMarkSweep.cpp

src/share/vm/memory/genMarkSweep.cpp

Print this page
rev 7211 : [mq]: remove_ngen
rev 7212 : [mq]: remove_get_gen
rev 7215 : imported patch remove_levels

*** 35,44 **** --- 35,45 ---- #include "gc_implementation/shared/gcTraceTime.hpp" #include "gc_interface/collectedHeap.inline.hpp" #include "memory/genCollectedHeap.hpp" #include "memory/genMarkSweep.hpp" #include "memory/genOopClosures.inline.hpp" + #include "memory/generation.hpp" #include "memory/generation.inline.hpp" #include "memory/modRefBarrierSet.hpp" #include "memory/referencePolicy.hpp" #include "memory/space.hpp" #include "oops/instanceRefKlass.hpp"
*** 50,61 **** #include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/copy.hpp" #include "utilities/events.hpp" ! void GenMarkSweep::invoke_at_safepoint(int level, ReferenceProcessor* rp, bool clear_all_softrefs) { ! guarantee(level == 1, "We always collect both old and young."); assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint"); GenCollectedHeap* gch = GenCollectedHeap::heap(); #ifdef ASSERT if (gch->collector_policy()->should_clear_all_soft_refs()) { --- 51,61 ---- #include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/copy.hpp" #include "utilities/events.hpp" ! void GenMarkSweep::invoke_at_safepoint(ReferenceProcessor* rp, bool clear_all_softrefs) { assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint"); GenCollectedHeap* gch = GenCollectedHeap::heap(); #ifdef ASSERT if (gch->collector_policy()->should_clear_all_soft_refs()) {
*** 84,106 **** size_t gch_prev_used = gch->used(); // Capture used regions for each generation that will be // subject to collection, so that card table adjustments can // be made intelligently (see clear / invalidate further below). ! gch->save_used_regions(level); allocate_stacks(); ! mark_sweep_phase1(level, clear_all_softrefs); mark_sweep_phase2(); // Don't add any more derived pointers during phase3 COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); ! mark_sweep_phase3(level); mark_sweep_phase4(); restore_marks(); --- 84,106 ---- size_t gch_prev_used = gch->used(); // Capture used regions for each generation that will be // subject to collection, so that card table adjustments can // be made intelligently (see clear / invalidate further below). ! gch->save_used_regions(); allocate_stacks(); ! mark_sweep_phase1(clear_all_softrefs); mark_sweep_phase2(); // Don't add any more derived pointers during phase3 COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity")); COMPILER2_PRESENT(DerivedPointerTable::set_active(false)); ! mark_sweep_phase3(); mark_sweep_phase4(); restore_marks();
*** 108,130 **** // (Should this be in general part?) gch->save_marks(); deallocate_stacks(); ! // If compaction completely evacuated all generations younger than this ! // one, then we can clear the card table. Otherwise, we must invalidate ! // it (consider all cards dirty). In the future, we might consider doing ! // compaction within generations only, and doing card-table sliding. ! bool all_empty = true; ! for (int i = 0; all_empty && i < level; i++) { ! Generation* g = gch->get_gen(i); ! all_empty = all_empty && gch->get_gen(i)->used() == 0; ! } GenRemSet* rs = gch->rem_set(); ! Generation* old_gen = gch->get_gen(level); // Clear/invalidate below make use of the "prev_used_regions" saved earlier. ! if (all_empty) { // We've evacuated all generations below us. rs->clear_into_younger(old_gen); } else { // Invalidate the cards corresponding to the currently used // region and clear those corresponding to the evacuated region. --- 108,125 ---- // (Should this be in general part?) gch->save_marks(); deallocate_stacks(); ! // If compaction completely evacuated the young generation we can clear ! // the card table. Otherwise, we must invalidate it (consider all cards dirty). ! // In the future, we might consider doing compaction within generations only, ! // and doing card-table sliding. GenRemSet* rs = gch->rem_set(); ! Generation* old_gen = gch->old_gen(); // Clear/invalidate below make use of the "prev_used_regions" saved earlier. ! if (gch->young_gen()->used() == 0) { // We've evacuated all generations below us. rs->clear_into_younger(old_gen); } else { // Invalidate the cards corresponding to the currently used // region and clear those corresponding to the evacuated region.
*** 158,168 **** void GenMarkSweep::allocate_stacks() { GenCollectedHeap* gch = GenCollectedHeap::heap(); // Scratch request on behalf of oldest generation; will do no // allocation. ! ScratchBlock* scratch = gch->gather_scratch(gch->_gens[gch->_n_gens-1], 0); // $$$ To cut a corner, we'll only use the first scratch block, and then // revert to malloc. if (scratch != NULL) { _preserved_count_max = --- 153,163 ---- void GenMarkSweep::allocate_stacks() { GenCollectedHeap* gch = GenCollectedHeap::heap(); // Scratch request on behalf of oldest generation; will do no // allocation. ! ScratchBlock* scratch = gch->gather_scratch(gch->old_gen(), 0); // $$$ To cut a corner, we'll only use the first scratch block, and then // revert to malloc. if (scratch != NULL) { _preserved_count_max =
*** 186,213 **** _preserved_oop_stack.clear(true); _marking_stack.clear(); _objarray_stack.clear(true); } ! void GenMarkSweep::mark_sweep_phase1(int level, ! bool clear_all_softrefs) { // Recursively traverse all live objects and mark them GCTraceTime tm("phase 1", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id()); trace(" 1"); GenCollectedHeap* gch = GenCollectedHeap::heap(); // Because follow_root_closure is created statically, cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors // are run. ! follow_root_closure.set_orig_generation(gch->get_gen(level)); // Need new claim bits before marking starts. ClassLoaderDataGraph::clear_claimed_marks(); ! gch->gen_process_roots(level, false, // Younger gens are not roots. true, // activate StrongRootsScope SharedHeap::SO_None, GenCollectedHeap::StrongRootsOnly, &follow_root_closure, --- 181,207 ---- _preserved_oop_stack.clear(true); _marking_stack.clear(); _objarray_stack.clear(true); } ! void GenMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { // Recursively traverse all live objects and mark them GCTraceTime tm("phase 1", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id()); trace(" 1"); GenCollectedHeap* gch = GenCollectedHeap::heap(); // Because follow_root_closure is created statically, cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors // are run. ! follow_root_closure.set_orig_generation(gch->old_gen()); // Need new claim bits before marking starts. ClassLoaderDataGraph::clear_claimed_marks(); ! gch->gen_process_roots(Generation::Old, false, // Younger gens are not roots. true, // activate StrongRootsScope SharedHeap::SO_None, GenCollectedHeap::StrongRootsOnly, &follow_root_closure,
*** 272,282 **** void do_generation(Generation* gen) { gen->adjust_pointers(); } }; ! void GenMarkSweep::mark_sweep_phase3(int level) { GenCollectedHeap* gch = GenCollectedHeap::heap(); // Adjust the pointers to reflect the new locations GCTraceTime tm("phase 3", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id()); trace("3"); --- 266,276 ---- void do_generation(Generation* gen) { gen->adjust_pointers(); } }; ! void GenMarkSweep::mark_sweep_phase3() { GenCollectedHeap* gch = GenCollectedHeap::heap(); // Adjust the pointers to reflect the new locations GCTraceTime tm("phase 3", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id()); trace("3");
*** 286,298 **** // Because the closure below is created statically, we cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors // are run. ! adjust_pointer_closure.set_orig_generation(gch->get_gen(level)); ! gch->gen_process_roots(level, false, // Younger gens are not roots. true, // activate StrongRootsScope SharedHeap::SO_AllCodeCache, GenCollectedHeap::StrongAndWeakRoots, &adjust_pointer_closure, --- 280,292 ---- // Because the closure below is created statically, we cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors // are run. ! adjust_pointer_closure.set_orig_generation(gch->old_gen()); ! gch->gen_process_roots(Generation::Old, false, // Younger gens are not roots. true, // activate StrongRootsScope SharedHeap::SO_AllCodeCache, GenCollectedHeap::StrongAndWeakRoots, &adjust_pointer_closure,
src/share/vm/memory/genMarkSweep.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File