313 f->do_oop(&_base[i]); |
313 f->do_oop(&_base[i]); |
314 } |
314 } |
315 } |
315 } |
316 |
316 |
317 bool ConcurrentMark::not_yet_marked(oop obj) const { |
317 bool ConcurrentMark::not_yet_marked(oop obj) const { |
318 return (_g1h->is_obj_ill(obj) |
318 return _g1h->is_obj_ill(obj); |
319 || (_g1h->is_in_permanent(obj) |
|
320 && !nextMarkBitMap()->isMarked((HeapWord*)obj))); |
|
321 } |
319 } |
322 |
320 |
323 CMRootRegions::CMRootRegions() : |
321 CMRootRegions::CMRootRegions() : |
324 _young_list(NULL), _cm(NULL), _scan_in_progress(false), |
322 _young_list(NULL), _cm(NULL), _scan_in_progress(false), |
325 _should_abort(false), _next_survivor(NULL) { } |
323 _should_abort(false), _next_survivor(NULL) { } |
1205 _card_bm->par_set_bit(i); |
1203 _card_bm->par_set_bit(i); |
1206 } |
1204 } |
1207 } else { |
1205 } else { |
1208 assert(last_idx < _card_bm->size(), "sanity"); |
1206 assert(last_idx < _card_bm->size(), "sanity"); |
1209 // Note BitMap::par_at_put_range() is exclusive. |
1207 // Note BitMap::par_at_put_range() is exclusive. |
1210 _card_bm->par_at_put_range(start_idx, last_idx+1, true); |
1208 BitMap::idx_t max_idx = MAX2(last_idx+1, _card_bm->size()); |
|
1209 _card_bm->par_at_put_range(start_idx, max_idx, true); |
1211 } |
1210 } |
1212 } |
1211 } |
1213 |
1212 |
1214 // It takes a region that's not empty (i.e., it has at least one |
1213 // It takes a region that's not empty (i.e., it has at least one |
1215 // live object in it and sets its corresponding bit on the region |
1214 // live object in it and sets its corresponding bit on the region |
1551 set_bit_for_region(hr); |
1550 set_bit_for_region(hr); |
1552 } |
1551 } |
1553 |
1552 |
1554 // Now set the bits for [ntams, top] |
1553 // Now set the bits for [ntams, top] |
1555 BitMap::idx_t start_idx = _cm->card_bitmap_index_for(ntams); |
1554 BitMap::idx_t start_idx = _cm->card_bitmap_index_for(ntams); |
1556 BitMap::idx_t last_idx = _cm->card_bitmap_index_for(top); |
1555 // set_card_bitmap_range() expects the last_idx to be with |
|
1556 // the range of the bit map (see assertion in set_card_bitmap_range()), |
|
1557 // so limit it to that range with this application of MIN2. |
|
1558 BitMap::idx_t last_idx = MIN2(_cm->card_bitmap_index_for(top), |
|
1559 _card_bm->size()-1); |
|
1560 if (start_idx < _card_bm->size()) { |
1557 set_card_bitmap_range(start_idx, last_idx); |
1561 set_card_bitmap_range(start_idx, last_idx); |
|
1562 } else { |
|
1563 // To reach here start_idx must be beyond the end of |
|
1564 // the bit map and last_idx must have been limited by |
|
1565 // the MIN2(). |
|
1566 assert(start_idx == last_idx + 1, |
|
1567 err_msg("Not beyond end start_idx " SIZE_FORMAT " last_idx " |
|
1568 SIZE_FORMAT, start_idx, last_idx)); |
|
1569 } |
1558 |
1570 |
1559 // Set the bit for the region if it contains live data |
1571 // Set the bit for the region if it contains live data |
1560 if (hr->next_marked_bytes() > 0) { |
1572 if (hr->next_marked_bytes() > 0) { |
1561 set_bit_for_region(hr); |
1573 set_bit_for_region(hr); |
1562 } |
1574 } |
2009 HeapWord* addr = (HeapWord*)obj; |
2021 HeapWord* addr = (HeapWord*)obj; |
2010 return addr != NULL && |
2022 return addr != NULL && |
2011 (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj)); |
2023 (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj)); |
2012 } |
2024 } |
2013 |
2025 |
2014 class G1CMKeepAliveClosure: public OopClosure { |
2026 class G1CMKeepAliveClosure: public ExtendedOopClosure { |
2015 G1CollectedHeap* _g1; |
2027 G1CollectedHeap* _g1; |
2016 ConcurrentMark* _cm; |
2028 ConcurrentMark* _cm; |
2017 public: |
2029 public: |
2018 G1CMKeepAliveClosure(G1CollectedHeap* g1, ConcurrentMark* cm) : |
2030 G1CMKeepAliveClosure(G1CollectedHeap* g1, ConcurrentMark* cm) : |
2019 _g1(g1), _cm(cm) { |
2031 _g1(g1), _cm(cm) { |
2050 _cm(cm), |
2062 _cm(cm), |
2051 _markStack(markStack), |
2063 _markStack(markStack), |
2052 _oopClosure(oopClosure) { } |
2064 _oopClosure(oopClosure) { } |
2053 |
2065 |
2054 void do_void() { |
2066 void do_void() { |
2055 _markStack->drain((OopClosure*)_oopClosure, _cm->nextMarkBitMap(), false); |
2067 _markStack->drain(_oopClosure, _cm->nextMarkBitMap(), false); |
2056 } |
2068 } |
2057 }; |
2069 }; |
2058 |
2070 |
2059 // 'Keep Alive' closure used by parallel reference processing. |
2071 // 'Keep Alive' closure used by parallel reference processing. |
2060 // An instance of this closure is used in the parallel reference processing |
2072 // An instance of this closure is used in the parallel reference processing |
2492 |
2504 |
2493 if (print_it) { |
2505 if (print_it) { |
2494 _out->print_cr(" "PTR_FORMAT"%s", |
2506 _out->print_cr(" "PTR_FORMAT"%s", |
2495 o, (over_tams) ? " >" : (marked) ? " M" : ""); |
2507 o, (over_tams) ? " >" : (marked) ? " M" : ""); |
2496 PrintReachableOopClosure oopCl(_out, _vo, _all); |
2508 PrintReachableOopClosure oopCl(_out, _vo, _all); |
2497 o->oop_iterate(&oopCl); |
2509 o->oop_iterate_no_header(&oopCl); |
2498 } |
2510 } |
2499 } |
2511 } |
2500 }; |
2512 }; |
2501 |
2513 |
2502 class PrintReachableRegionClosure : public HeapRegionClosure { |
2514 class PrintReachableRegionClosure : public HeapRegionClosure { |