# HG changeset patch # User tschatzl # Date 1523344343 -7200 # Node ID 2bbd5117d91a59111177c92274d22a38a5676aa9 # Parent 4ae63fcabe2ed8b6cb5bd848f31359904b5eaaf2 8200385: Eagerly reclaimed humongous objects leave mark in prev bitmap Summary: Also clear marks on prev bitmap on eager reclaim Reviewed-by: sangheki, sjohanss diff -r 4ae63fcabe2e -r 2bbd5117d91a src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Mon Apr 09 10:09:38 2018 +0200 +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Tue Apr 10 09:12:23 2018 +0200 @@ -4691,7 +4691,13 @@ obj->is_typeArray() ); - g1h->concurrent_mark()->humongous_object_eagerly_reclaimed(r); + G1ConcurrentMark* const cm = g1h->concurrent_mark(); + cm->humongous_object_eagerly_reclaimed(r); + assert(!cm->is_marked_in_prev_bitmap(obj) && !cm->is_marked_in_next_bitmap(obj), + "Eagerly reclaimed humongous region %u should not be marked at all but is in prev %s next %s", + region_idx, + BOOL_TO_STR(cm->is_marked_in_prev_bitmap(obj)), + BOOL_TO_STR(cm->is_marked_in_next_bitmap(obj))); _humongous_objects_reclaimed++; do { HeapRegion* next = g1h->next_region_in_humongous(r); diff -r 4ae63fcabe2e -r 2bbd5117d91a src/hotspot/share/gc/g1/g1ConcurrentMark.cpp --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp Mon Apr 09 10:09:38 2018 +0200 +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp Tue Apr 10 09:12:23 2018 +0200 @@ -530,13 +530,18 @@ } } +static void clear_mark_if_set(G1CMBitMap* bitmap, HeapWord* addr) { + if (bitmap->is_marked(addr)) { + bitmap->clear(addr); + } +} + void G1ConcurrentMark::humongous_object_eagerly_reclaimed(HeapRegion* r) { assert_at_safepoint_on_vm_thread(); - // Need to clear mark bit of the humongous object. - if (_next_mark_bitmap->is_marked(r->bottom())) { - _next_mark_bitmap->clear(r->bottom()); - } + // Need to clear all mark bits of the humongous object. + clear_mark_if_set(_prev_mark_bitmap, r->bottom()); + clear_mark_if_set(_next_mark_bitmap, r->bottom()); if (!_g1h->collector_state()->mark_or_rebuild_in_progress()) { return; diff -r 4ae63fcabe2e -r 2bbd5117d91a src/hotspot/share/gc/g1/g1ConcurrentMark.hpp --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp Mon Apr 09 10:09:38 2018 +0200 +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp Tue Apr 10 09:12:23 2018 +0200 @@ -589,6 +589,8 @@ inline bool mark_in_next_bitmap(uint worker_id, HeapRegion* const hr, oop const obj, size_t const obj_size = 0); inline bool mark_in_next_bitmap(uint worker_id, oop const obj, size_t const obj_size = 0); + inline bool is_marked_in_next_bitmap(oop p) const; + // Returns true if initialization was successfully completed. bool completed_initialization() const { return _completed_initialization; diff -r 4ae63fcabe2e -r 2bbd5117d91a src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp Mon Apr 09 10:09:38 2018 +0200 +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp Tue Apr 10 09:12:23 2018 +0200 @@ -255,6 +255,11 @@ return _prev_mark_bitmap->is_marked((HeapWord*)p); } +bool G1ConcurrentMark::is_marked_in_next_bitmap(oop p) const { + assert(p != NULL && oopDesc::is_oop(p), "expected an oop"); + return _next_mark_bitmap->is_marked((HeapWord*)p); +} + inline bool G1ConcurrentMark::do_yield_check() { if (SuspendibleThreadSet::should_yield()) { SuspendibleThreadSet::yield();