comparison src/share/vm/memory/cardTableRS.cpp @ 3357:fc2b798ab316

6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests Summary: Fixed process_chunk_boundaries(), used for parallel card scanning when using ParNew/CMS, so as to prevent double-scanning, or worse, non-scanning of imprecisely marked objects exceeding parallel chunk size. Made some sizing parameters for parallel card scanning diagnostic, disabled ParallelGCRetainPLAB, and elaborated and clarified some comments. Reviewed-by: stefank, johnc
author ysr
date Tue, 10 May 2011 00:33:21 -0700
parents 1f4413413144
children bca17e38de00
comparison
equal deleted inserted replaced
3325:54a56bbaf95b 3357:fc2b798ab316
160 *entry = CardTableRS::clean_card_val(); 160 *entry = CardTableRS::clean_card_val();
161 return true; 161 return true;
162 } 162 }
163 163
164 ClearNoncleanCardWrapper::ClearNoncleanCardWrapper( 164 ClearNoncleanCardWrapper::ClearNoncleanCardWrapper(
165 MemRegionClosure* dirty_card_closure, CardTableRS* ct) : 165 DirtyCardToOopClosure* dirty_card_closure, CardTableRS* ct) :
166 _dirty_card_closure(dirty_card_closure), _ct(ct) { 166 _dirty_card_closure(dirty_card_closure), _ct(ct) {
167 _is_par = (SharedHeap::heap()->n_par_threads() > 0); 167 _is_par = (SharedHeap::heap()->n_par_threads() > 0);
168 } 168 }
169 169
170 void ClearNoncleanCardWrapper::do_MemRegion(MemRegion mr) { 170 void ClearNoncleanCardWrapper::do_MemRegion(MemRegion mr) {
244 } while (true); 244 } while (true);
245 } 245 }
246 246
247 void CardTableRS::younger_refs_in_space_iterate(Space* sp, 247 void CardTableRS::younger_refs_in_space_iterate(Space* sp,
248 OopsInGenClosure* cl) { 248 OopsInGenClosure* cl) {
249 DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, _ct_bs->precision(),
250 cl->gen_boundary());
251 ClearNoncleanCardWrapper clear_cl(dcto_cl, this);
252
253 const MemRegion urasm = sp->used_region_at_save_marks(); 249 const MemRegion urasm = sp->used_region_at_save_marks();
254 #ifdef ASSERT 250 #ifdef ASSERT
255 // Convert the assertion check to a warning if we are running 251 // Convert the assertion check to a warning if we are running
256 // CMS+ParNew until related bug is fixed. 252 // CMS+ParNew until related bug is fixed.
257 MemRegion ur = sp->used_region(); 253 MemRegion ur = sp->used_region();
273 warning("CMS+ParNew: Flickering used_region()!!"); 269 warning("CMS+ParNew: Flickering used_region()!!");
274 } 270 }
275 if (!urasm.equals(urasm2)) { 271 if (!urasm.equals(urasm2)) {
276 warning("CMS+ParNew: Flickering used_region_at_save_marks()!!"); 272 warning("CMS+ParNew: Flickering used_region_at_save_marks()!!");
277 } 273 }
274 ShouldNotReachHere();
278 } 275 }
279 #endif 276 #endif
280 _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm, 277 _ct_bs->non_clean_card_iterate_possibly_parallel(sp, urasm, cl, this);
281 dcto_cl, &clear_cl);
282 } 278 }
283 279
284 void CardTableRS::clear_into_younger(Generation* gen, bool clear_perm) { 280 void CardTableRS::clear_into_younger(Generation* gen, bool clear_perm) {
285 GenCollectedHeap* gch = GenCollectedHeap::heap(); 281 GenCollectedHeap* gch = GenCollectedHeap::heap();
286 // Generations younger than gen have been evacuated. We can clear 282 // Generations younger than gen have been evacuated. We can clear