Mercurial > hg > graal-jvmci-8
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 |