--- old/src/share/vm/gc/g1/g1CollectedHeap.cpp 2017-07-10 14:17:57.781255637 +0200 +++ new/src/share/vm/gc/g1/g1CollectedHeap.cpp 2017-07-10 14:17:57.680252504 +0200 @@ -1684,14 +1684,6 @@ Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap"); Universe::check_alignment(max_byte_size, heap_alignment, "g1 heap"); - _refine_cte_cl = new RefineCardTableEntryClosure(); - - jint ecode = JNI_OK; - _cg1r = ConcurrentG1Refine::create(_refine_cte_cl, &ecode); - if (_cg1r == NULL) { - return ecode; - } - // Reserve the maximum. // When compressed oops are enabled, the preferred heap base @@ -1720,9 +1712,6 @@ // Create the hot card cache. _hot_card_cache = new G1HotCardCache(this); - // Also create a G1 rem set. - _g1_rem_set = new G1RemSet(this, g1_barrier_set(), _hot_card_cache); - // Carve out the G1 part of the heap. ReservedSpace g1_rs = heap_rs.first_part(max_byte_size); size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size(); @@ -1774,7 +1763,9 @@ const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1; guarantee((max_regions() - 1) <= max_region_idx, "too many regions"); - g1_rem_set()->initialize(max_capacity(), max_regions()); + // Also create a G1 rem set. + _g1_rem_set = new G1RemSet(this, g1_barrier_set(), _hot_card_cache); + _g1_rem_set->initialize(max_capacity(), max_regions()); size_t max_cards_per_region = ((size_t)1 << (sizeof(CardIdx_t)*BitsPerByte-1)) - 1; guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized"); @@ -1817,6 +1808,14 @@ G1SATBProcessCompletedThreshold, Shared_SATB_Q_lock); + _refine_cte_cl = new RefineCardTableEntryClosure(); + + jint ecode = JNI_OK; + _cg1r = ConcurrentG1Refine::create(_refine_cte_cl, &ecode); + if (_cg1r == NULL) { + return ecode; + } + JavaThread::dirty_card_queue_set().initialize(_refine_cte_cl, DirtyCardQ_CBL_mon, DirtyCardQ_FL_lock, @@ -1859,6 +1858,8 @@ _collection_set.initialize(max_regions()); + _g1_rem_set->initialize_periodic_summary_info(); + return JNI_OK; }