Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 283:9199f248b0ee
6722112: CMS: Incorrect encoding of overflown object arrays during concurrent precleaning
Summary: When an object array overflows during precleaning, we should have been marking the entire array dirty, not just its first card.
Reviewed-by: jmasa, poonam, tonyp
author | ysr |
---|---|
date | Thu, 14 Aug 2008 17:58:35 -0700 |
parents | 818a18cd69a8 |
children | ebeb6490b814 1ee8caae33af |
comparison
equal
deleted
inserted
replaced
277:79276d1b7e50 | 283:9199f248b0ee |
---|---|
6865 // We re-dirty the cards on which this object lies and increase | 6865 // We re-dirty the cards on which this object lies and increase |
6866 // the _threshold so that we'll come back to scan this object | 6866 // the _threshold so that we'll come back to scan this object |
6867 // during the preclean or remark phase. (CMSCleanOnEnter) | 6867 // during the preclean or remark phase. (CMSCleanOnEnter) |
6868 if (CMSCleanOnEnter) { | 6868 if (CMSCleanOnEnter) { |
6869 size_t sz = _collector->block_size_using_printezis_bits(addr); | 6869 size_t sz = _collector->block_size_using_printezis_bits(addr); |
6870 HeapWord* start_card_addr = (HeapWord*)round_down( | |
6871 (intptr_t)addr, CardTableModRefBS::card_size); | |
6872 HeapWord* end_card_addr = (HeapWord*)round_to( | 6870 HeapWord* end_card_addr = (HeapWord*)round_to( |
6873 (intptr_t)(addr+sz), CardTableModRefBS::card_size); | 6871 (intptr_t)(addr+sz), CardTableModRefBS::card_size); |
6874 MemRegion redirty_range = MemRegion(start_card_addr, end_card_addr); | 6872 MemRegion redirty_range = MemRegion(addr, end_card_addr); |
6875 assert(!redirty_range.is_empty(), "Arithmetical tautology"); | 6873 assert(!redirty_range.is_empty(), "Arithmetical tautology"); |
6876 // Bump _threshold to end_card_addr; note that | 6874 // Bump _threshold to end_card_addr; note that |
6877 // _threshold cannot possibly exceed end_card_addr, anyhow. | 6875 // _threshold cannot possibly exceed end_card_addr, anyhow. |
6878 // This prevents future clearing of the card as the scan proceeds | 6876 // This prevents future clearing of the card as the scan proceeds |
6879 // to the right. | 6877 // to the right. |
7458 simulate_overflow = true; | 7456 simulate_overflow = true; |
7459 } | 7457 } |
7460 ) | 7458 ) |
7461 if (simulate_overflow || !_mark_stack->push(obj)) { | 7459 if (simulate_overflow || !_mark_stack->push(obj)) { |
7462 if (_concurrent_precleaning) { | 7460 if (_concurrent_precleaning) { |
7463 // During precleaning we can just dirty the appropriate card | 7461 // During precleaning we can just dirty the appropriate card(s) |
7464 // in the mod union table, thus ensuring that the object remains | 7462 // in the mod union table, thus ensuring that the object remains |
7465 // in the grey set and continue. Note that no one can be intefering | 7463 // in the grey set and continue. In the case of object arrays |
7466 // with us in this action of dirtying the mod union table, so | 7464 // we need to dirty all of the cards that the object spans, |
7467 // no locking is required. | 7465 // since the rescan of object arrays will be limited to the |
7468 _mod_union_table->mark(addr); | 7466 // dirty cards. |
7467 // Note that no one can be intefering with us in this action | |
7468 // of dirtying the mod union table, so no locking or atomics | |
7469 // are required. | |
7470 if (obj->is_objArray()) { | |
7471 size_t sz = obj->size(); | |
7472 HeapWord* end_card_addr = (HeapWord*)round_to( | |
7473 (intptr_t)(addr+sz), CardTableModRefBS::card_size); | |
7474 MemRegion redirty_range = MemRegion(addr, end_card_addr); | |
7475 assert(!redirty_range.is_empty(), "Arithmetical tautology"); | |
7476 _mod_union_table->mark_range(redirty_range); | |
7477 } else { | |
7478 _mod_union_table->mark(addr); | |
7479 } | |
7469 _collector->_ser_pmc_preclean_ovflw++; | 7480 _collector->_ser_pmc_preclean_ovflw++; |
7470 } else { | 7481 } else { |
7471 // During the remark phase, we need to remember this oop | 7482 // During the remark phase, we need to remember this oop |
7472 // in the overflow list. | 7483 // in the overflow list. |
7473 _collector->push_on_overflow_list(obj); | 7484 _collector->push_on_overflow_list(obj); |