Mercurial > hg > jdk9-shenandoah > hotspot
changeset 9609:357943ab942a
Reset mark bitmap concurrently with Java threads and using all concurrent GC threads.
author | rkennke |
---|---|
date | Mon, 07 Sep 2015 23:43:31 +0200 |
parents | 8ab33a6942a6 |
children | 5e256d10f5e3 |
files | src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp src/share/vm/gc/shenandoah/shenandoahHeap.cpp src/share/vm/gc/shenandoah/shenandoahHeap.hpp src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp |
diffstat | 5 files changed, 27 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp Mon Sep 07 17:24:25 2015 +0200 +++ b/src/share/vm/gc/shenandoah/shenandoahConcurrentThread.cpp Mon Sep 07 23:43:31 2015 +0200 @@ -101,6 +101,9 @@ if (heap->is_evacuation_in_progress()) { heap->set_evacuation_in_progress(false); } + heap->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps); + heap->reset_mark_bitmap(); + heap->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps); } } else {
--- a/src/share/vm/gc/shenandoah/shenandoahHeap.cpp Mon Sep 07 17:24:25 2015 +0200 +++ b/src/share/vm/gc/shenandoah/shenandoahHeap.cpp Mon Sep 07 23:43:31 2015 +0200 @@ -225,8 +225,31 @@ } } +class ResetBitmapTask : public AbstractGangTask { +private: + ShenandoahHeapRegionSet* _regions; + +public: + ResetBitmapTask(ShenandoahHeapRegionSet* regions) : + AbstractGangTask("Parallel Reset Bitmap Task"), + _regions(regions) { + } + + void work(uint worker_id) { + ShenandoahHeapRegion* region = _regions->claim_next(); + ShenandoahHeap* heap = ShenandoahHeap::heap(); + while (region != NULL) { + heap->reset_mark_bitmap_range(region->bottom(), region->end()); + region = _regions->claim_next(); + } + } +}; + void ShenandoahHeap::reset_mark_bitmap() { - _next_mark_bit_map->clearAll(); + ShenandoahHeapRegionSet regions = ShenandoahHeapRegionSet(_num_regions, _ordered_regions, _num_regions); + ResetBitmapTask task = ResetBitmapTask(®ions); + conc_workers()->set_active_workers(_max_conc_workers); + conc_workers()->run_task(&task); } void ShenandoahHeap::reset_mark_bitmap_range(HeapWord* from, HeapWord* to) { @@ -1371,7 +1394,6 @@ // Update-references completed, no need to update-refs during marking. set_need_update_refs(false); - set_need_reset_bitmaps(false); } Universe::update_heap_info_at_gc(); @@ -2827,14 +2849,6 @@ _need_update_refs = need_update_refs; } -void ShenandoahHeap::set_need_reset_bitmaps(bool need_reset_bitmaps) { - _need_reset_bitmaps = need_reset_bitmaps; -} - -bool ShenandoahHeap::need_reset_bitmaps() const { - return _need_reset_bitmaps; -} - ShenandoahJNICritical* ShenandoahHeap::jni_critical() { return _jni_critical; }
--- a/src/share/vm/gc/shenandoah/shenandoahHeap.hpp Mon Sep 07 17:24:25 2015 +0200 +++ b/src/share/vm/gc/shenandoah/shenandoahHeap.hpp Mon Sep 07 23:43:31 2015 +0200 @@ -333,9 +333,6 @@ inline bool need_update_refs() const; void set_need_update_refs(bool update_refs); - bool need_reset_bitmaps() const; - void set_need_reset_bitmaps(bool need_reset_bitmaps); - ReferenceProcessor* ref_processor() { return _ref_processor;} virtual void ref_processing_init(); ShenandoahIsAliveClosure isAlive;
--- a/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp Mon Sep 07 17:24:25 2015 +0200 +++ b/src/share/vm/gc/shenandoah/shenandoahMarkCompact.cpp Mon Sep 07 23:43:31 2015 +0200 @@ -33,9 +33,6 @@ assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint"); IsGCActiveMark is_active; - // if concgc gets cancelled between phases the bitmap doesn't get cleared up. - _heap->reset_mark_bitmap(); - assert(Thread::current()->is_VM_thread(), "Do full GC only while world is stopped"); assert(_heap->is_bitmap_clear(), "require cleared bitmap"); assert(!_heap->concurrent_mark_in_progress(), "can't do full-GC while marking is in progress");
--- a/src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp Mon Sep 07 17:24:25 2015 +0200 +++ b/src/share/vm/gc/shenandoah/vm_operations_shenandoah.cpp Mon Sep 07 23:43:31 2015 +0200 @@ -18,16 +18,8 @@ ShenandoahHeap *sh = (ShenandoahHeap*) Universe::heap(); sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::init_mark); - if (sh->need_reset_bitmaps()) { - sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::reset_bitmaps); - sh->reset_mark_bitmap(); - sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::reset_bitmaps); - } - assert(sh->is_bitmap_clear(), "need clear marking bitmap"); - sh->set_need_reset_bitmaps(true); - if (ShenandoahGCVerbose) tty->print("vm_ShenandoahInitMark\n"); sh->start_concurrent_marking();