1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Sat Oct 24 16:18:50 2020 +0800 1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Sat Oct 24 16:43:47 2020 +0800 1.3 @@ -27,6 +27,7 @@ 1.4 1.5 #include "gc_implementation/g1/concurrentMark.hpp" 1.6 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" 1.7 +#include "gc_implementation/g1/g1ConcurrentMarkObjArrayProcessor.inline.hpp" 1.8 1.9 // Utility routine to set an exclusive range of cards on the given 1.10 // card liveness bitmap 1.11 @@ -224,11 +225,11 @@ 1.12 1.13 inline void CMTask::push(oop obj) { 1.14 HeapWord* objAddr = (HeapWord*) obj; 1.15 - assert(_g1h->is_in_g1_reserved(objAddr), "invariant"); 1.16 - assert(!_g1h->is_on_master_free_list( 1.17 + assert(G1CMObjArrayProcessor::is_array_slice(obj) || _g1h->is_in_g1_reserved(objAddr), "invariant"); 1.18 + assert(G1CMObjArrayProcessor::is_array_slice(obj) || !_g1h->is_on_master_free_list( 1.19 _g1h->heap_region_containing((HeapWord*) objAddr)), "invariant"); 1.20 - assert(!_g1h->is_obj_ill(obj), "invariant"); 1.21 - assert(_nextMarkBitMap->isMarked(objAddr), "invariant"); 1.22 + assert(G1CMObjArrayProcessor::is_array_slice(obj) || !_g1h->is_obj_ill(obj), "invariant"); 1.23 + assert(G1CMObjArrayProcessor::is_array_slice(obj) || _nextMarkBitMap->isMarked(objAddr), "invariant"); 1.24 1.25 if (_cm->verbose_high()) { 1.26 gclog_or_tty->print_cr("[%u] pushing " PTR_FORMAT, _worker_id, p2i((void*) obj)); 1.27 @@ -365,6 +366,11 @@ 1.28 } 1.29 } 1.30 1.31 +inline size_t CMTask::scan_objArray(objArrayOop obj, MemRegion mr) { 1.32 + obj->oop_iterate(_cm_oop_closure, mr); 1.33 + return mr.word_size(); 1.34 +} 1.35 + 1.36 inline void ConcurrentMark::markPrev(oop p) { 1.37 assert(!_prevMarkBitMap->isMarked((HeapWord*) p), "sanity"); 1.38 // Note we are overriding the read-only view of the prev map here, via