# HG changeset patch # User Roman Kennke # Date 1423694578 -3600 # Node ID 7c17c9b67762d05d9161d1afccec199f80acdfd8 # Parent c0734957b5058ef2ef50e9a23263480d2b129cdd Reset mark bitmaps piggy-backed on reference-updating. diff -r c0734957b505 -r 7c17c9b67762 src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp Wed Feb 11 23:42:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp Wed Feb 11 23:42:58 2015 +0100 @@ -487,7 +487,9 @@ print_summary_sd("Final Update Refs Pauses", &(_timing_data[final_uprefs]._ms)); print_summary_sd(" Update roots", &(_timing_data[update_roots]._ms)); print_summary_sd(" Recycle regions", &(_timing_data[recycle_regions]._ms)); - print_summary_sd(" Reset bitmaps", &(_timing_data[reset_bitmaps]._ms)); + if (! ShenandoahUpdateRefsEarly) { + print_summary_sd(" Reset bitmaps", &(_timing_data[reset_bitmaps]._ms)); + } print_summary_sd(" Resize TLABs", &(_timing_data[resize_tlabs]._ms)); gclog_or_tty->print_cr(" "); print_summary_sd("Concurrent Marking Times", &(_timing_data[conc_mark]._ms)); diff -r c0734957b505 -r 7c17c9b67762 src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp Wed Feb 11 23:42:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp Wed Feb 11 23:42:58 2015 +0100 @@ -145,23 +145,14 @@ size_t bitmap_size = CMBitMap::compute_size(heap_rs.size()); MemRegion heap_region = MemRegion((HeapWord*) heap_rs.base(), heap_rs.size() / HeapWordSize); - ReservedSpace bitmap_0(ReservedSpace::allocation_align_size_up(bitmap_size)); - os::commit_memory_or_exit(bitmap_0.base(), bitmap_0.size(), false, err_msg("couldn't allocate mark bitmap 0")); - - MemRegion bitmap_0_region = MemRegion((HeapWord*) bitmap_0.base(), bitmap_0.size() / HeapWordSize); - _mark_bit_map0.initialize(heap_region, bitmap_0_region); - - ReservedSpace bitmap_1(ReservedSpace::allocation_align_size_up(bitmap_size)); - os::commit_memory_or_exit(bitmap_1.base(), bitmap_1.size(), false, err_msg("couldn't allocate mark bitmap 1")); - MemRegion bitmap_1_region = MemRegion((HeapWord*) bitmap_1.base(), bitmap_1.size() / HeapWordSize); - _mark_bit_map1.initialize(heap_region, bitmap_1_region); - - _prev_mark_bit_map = &_mark_bit_map0; - _next_mark_bit_map = &_mark_bit_map1; + ReservedSpace bitmap(ReservedSpace::allocation_align_size_up(bitmap_size)); + os::commit_memory_or_exit(bitmap.base(), bitmap.size(), false, err_msg("couldn't allocate mark bitmap")); + MemRegion bitmap_region = MemRegion((HeapWord*) bitmap.base(), bitmap.size() / HeapWordSize); + _mark_bit_map.initialize(heap_region, bitmap_region); + + _next_mark_bit_map = &_mark_bit_map; reset_mark_bitmap(); - // TODO: Implement swapping of mark bitmaps. - // Initialize fast collection set test structure. _in_cset_fast_test_length = _max_regions; _in_cset_fast_test_base = @@ -193,8 +184,7 @@ _in_cset_fast_test(NULL), _in_cset_fast_test_base(NULL), _tracer(new (ResourceObj::C_HEAP, mtGC) ShenandoahTracer()), - _mark_bit_map0(), - _mark_bit_map1(), + _mark_bit_map(), _cancelled_evacuation(false) { _pgc = this; _scm = new ShenandoahConcurrentMark(); @@ -203,12 +193,13 @@ } void ShenandoahHeap::reset_mark_bitmap() { - CMBitMap* current = _next_mark_bit_map; - _next_mark_bit_map = _prev_mark_bit_map; - _prev_mark_bit_map = current; _next_mark_bit_map->clearAll(); } +void ShenandoahHeap::reset_mark_bitmap_range(HeapWord* from, HeapWord* to) { + _next_mark_bit_map->clearRange(MemRegion(from, to)); +} + class BitmapClearClosure : public BitMapClosure { private: CMBitMap* _bm; @@ -1144,6 +1135,7 @@ HeapWord* failed = region->object_iterate_careful(&update_refs_cl); assert(failed == NULL, "careful iteration is implemented safe for now in Shenandaoh"); } + heap->reset_mark_bitmap_range(region->bottom(), region->end()); region = _regions->claim_next(); } } @@ -2167,11 +2159,9 @@ tty->print_cr("heap region containing obj:"); ShenandoahHeapRegion* obj_region = heap_region_containing(obj); obj_region->print(); - tty->print_cr("obj has been marked prev: %d", is_marked_prev(obj)); tty->print_cr("heap region containing forwardee:"); ShenandoahHeapRegion* forward_region = heap_region_containing(oopDesc::bs()->resolve_oop(obj)); forward_region->print(); - tty->print_cr("fwd has been marked prev: %d", is_marked_prev(oopDesc::bs()->resolve_oop(obj))); } #endif @@ -2187,10 +2177,6 @@ return _next_mark_bit_map->isMarked((HeapWord*) obj); } -bool ShenandoahHeap::is_marked_prev(oop obj) const { - return _prev_mark_bit_map->isMarked((HeapWord*) obj); -} - void ShenandoahHeap::verify_copy(oop p,oop c){ assert(p != oopDesc::bs()->resolve_oop(p), "forwarded correctly"); assert(oopDesc::bs()->resolve_oop(p) == c, "verify pointer is correct"); diff -r c0734957b505 -r 7c17c9b67762 src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp --- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp Wed Feb 11 23:42:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.hpp Wed Feb 11 23:42:58 2015 +0100 @@ -83,12 +83,9 @@ int _max_conc_workers; volatile size_t _used; - CMBitMap _mark_bit_map0; + CMBitMap _mark_bit_map; CMBitMap* _next_mark_bit_map; - CMBitMap _mark_bit_map1; - CMBitMap* _prev_mark_bit_map; - bool* _in_cset_fast_test; bool* _in_cset_fast_test_base; uint _in_cset_fast_test_length; @@ -234,6 +231,8 @@ } void reset_mark_bitmap(); + void reset_mark_bitmap_range(HeapWord* from, HeapWord* to); + bool is_bitmap_clear(); virtual void post_allocation_collector_specific_setup(HeapWord* obj); diff -r c0734957b505 -r 7c17c9b67762 src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp --- a/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp Wed Feb 11 23:42:55 2015 +0100 +++ b/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp Wed Feb 11 23:42:58 2015 +0100 @@ -225,11 +225,17 @@ sh->verify_regions_after_update_refs(); } - sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps); - - sh->reset_mark_bitmap(); - - sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps); + if (! ShenandoahUpdateRefsEarly) { + // TODO: Do this concurrently after evacuation. + sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps); + sh->reset_mark_bitmap(); + sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps); + } +#ifdef ASSERT + else { + assert(sh->is_bitmap_clear(), "need cleared bitmap here"); + } +#endif sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::resize_tlabs);