# HG changeset patch # User rkennke # Date 1490902927 -7200 # Thu Mar 30 21:42:07 2017 +0200 # Node ID 85ad2bfde517205f6e8f7da4e0b23faccee95665 # Parent eb6ebd9816cf2a1849864bcbf41abc65eb8a4e45 Interleave partial GCs with concurrent GCs. diff --git a/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp b/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp --- a/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp +++ b/src/share/vm/gc/shenandoah/shenandoahCollectorPolicy.cpp @@ -684,9 +684,8 @@ virtual ~PartialHeuristics() {} - bool should_start_concurrent_mark(size_t used, size_t capacity) const { - // Never do concurrent GCs. - return false; + bool update_refs_early() { + return true; } bool should_start_partial_gc() { diff --git a/src/share/vm/gc/shenandoah/shenandoahHeap.cpp b/src/share/vm/gc/shenandoah/shenandoahHeap.cpp --- a/src/share/vm/gc/shenandoah/shenandoahHeap.cpp +++ b/src/share/vm/gc/shenandoah/shenandoahHeap.cpp @@ -2637,6 +2637,7 @@ set_evacuation_in_progress_at_safepoint(false); set_update_refs_in_progress(true); ensure_parsability(true); + connection_matrix()->clear_all(); for (uint i = 0; i < _num_regions; i++) { ShenandoahHeapRegion* r = _ordered_regions->get(i); r->set_concurrent_iteration_safe_limit(r->top()); diff --git a/src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp b/src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp --- a/src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp +++ b/src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp @@ -430,6 +430,8 @@ inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) { assert(BrooksPointer::word_offset() < 0, "skip_delta calculation below assumes the forwarding ptr is before obj"); + assert(! region->is_humongous_continuation(), "no humongous continuation regions here"); + CMBitMap* mark_bit_map = _complete_mark_bit_map; HeapWord* top_at_mark_start = complete_top_at_mark_start(region->bottom()); diff --git a/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp b/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp --- a/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp +++ b/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp @@ -34,7 +34,10 @@ template inline void ShenandoahUpdateHeapRefsClosure::do_oop_nv(T* p) { - _heap->maybe_update_oop_ref(p); + oop obj = _heap->maybe_update_oop_ref(p); + if (! oopDesc::is_null(obj)) { + _heap->connection_matrix()->set_connected(p, obj); + } } #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_INLINE_HPP diff --git a/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp b/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp --- a/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp +++ b/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp @@ -106,7 +106,9 @@ ShenandoahHeapRegion* r = _root_regions->claim_next(); while (r != NULL) { assert(r->is_root(), "must be root region"); - r->oop_iterate(&cl); + if (! r->is_humongous_continuation()) { + _heap->marked_object_oop_iterate(r, &cl); + } r->set_root(false); if (check_and_handle_cancelled_gc()) return; r = _root_regions->claim_next(); @@ -299,6 +301,11 @@ for (size_t i = 0; i < num_cset; i++) { ShenandoahHeapRegion* r = _heap->collection_set()->get(i); _heap->decrease_used(r->used()); + HeapWord* bottom = r->bottom(); + HeapWord* top = _heap->complete_top_at_mark_start(r->bottom()); + if (top > bottom) { + _heap->complete_mark_bit_map()->clear_range_large(MemRegion(bottom, top)); + } r->recycle(); _heap->free_regions()->add_region(r); } @@ -343,7 +350,7 @@ if (UPDATE_MATRIX) { #ifdef ASSERT oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj); - assert(oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must not be evacuated"); + assert(oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must not be evacuated: "PTR_FORMAT" -> "PTR_FORMAT, p2i(obj), p2i(forw)); #endif _matrix->set_connected(p, obj); }