32 #include "gc_implementation/g1/g1ErgoVerbose.hpp" |
32 #include "gc_implementation/g1/g1ErgoVerbose.hpp" |
33 #include "gc_implementation/g1/g1Log.hpp" |
33 #include "gc_implementation/g1/g1Log.hpp" |
34 #include "gc_implementation/g1/g1OopClosures.inline.hpp" |
34 #include "gc_implementation/g1/g1OopClosures.inline.hpp" |
35 #include "gc_implementation/g1/g1RemSet.hpp" |
35 #include "gc_implementation/g1/g1RemSet.hpp" |
36 #include "gc_implementation/g1/heapRegion.inline.hpp" |
36 #include "gc_implementation/g1/heapRegion.inline.hpp" |
|
37 #include "gc_implementation/g1/heapRegionManager.inline.hpp" |
37 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
38 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
38 #include "gc_implementation/g1/heapRegionSeq.inline.hpp" |
|
39 #include "gc_implementation/g1/heapRegionSet.inline.hpp" |
39 #include "gc_implementation/g1/heapRegionSet.inline.hpp" |
40 #include "gc_implementation/shared/vmGCOperations.hpp" |
40 #include "gc_implementation/shared/vmGCOperations.hpp" |
41 #include "gc_implementation/shared/gcTimer.hpp" |
41 #include "gc_implementation/shared/gcTimer.hpp" |
42 #include "gc_implementation/shared/gcTrace.hpp" |
42 #include "gc_implementation/shared/gcTrace.hpp" |
43 #include "gc_implementation/shared/gcTraceTime.hpp" |
43 #include "gc_implementation/shared/gcTraceTime.hpp" |
1406 // to 1 the bits on the region bitmap that correspond to its |
1406 // to 1 the bits on the region bitmap that correspond to its |
1407 // associated "continues humongous" regions. |
1407 // associated "continues humongous" regions. |
1408 void set_bit_for_region(HeapRegion* hr) { |
1408 void set_bit_for_region(HeapRegion* hr) { |
1409 assert(!hr->continuesHumongous(), "should have filtered those out"); |
1409 assert(!hr->continuesHumongous(), "should have filtered those out"); |
1410 |
1410 |
1411 BitMap::idx_t index = (BitMap::idx_t) hr->hrs_index(); |
1411 BitMap::idx_t index = (BitMap::idx_t) hr->hrm_index(); |
1412 if (!hr->startsHumongous()) { |
1412 if (!hr->startsHumongous()) { |
1413 // Normal (non-humongous) case: just set the bit. |
1413 // Normal (non-humongous) case: just set the bit. |
1414 _region_bm->par_at_put(index, true); |
1414 _region_bm->par_at_put(index, true); |
1415 } else { |
1415 } else { |
1416 // Starts humongous case: calculate how many regions are part of |
1416 // Starts humongous case: calculate how many regions are part of |
1594 // we have missed accounting some objects during the actual marking. |
1594 // we have missed accounting some objects during the actual marking. |
1595 if (exp_marked_bytes > act_marked_bytes) { |
1595 if (exp_marked_bytes > act_marked_bytes) { |
1596 if (_verbose) { |
1596 if (_verbose) { |
1597 gclog_or_tty->print_cr("Region %u: marked bytes mismatch: " |
1597 gclog_or_tty->print_cr("Region %u: marked bytes mismatch: " |
1598 "expected: " SIZE_FORMAT ", actual: " SIZE_FORMAT, |
1598 "expected: " SIZE_FORMAT ", actual: " SIZE_FORMAT, |
1599 hr->hrs_index(), exp_marked_bytes, act_marked_bytes); |
1599 hr->hrm_index(), exp_marked_bytes, act_marked_bytes); |
1600 } |
1600 } |
1601 failures += 1; |
1601 failures += 1; |
1602 } |
1602 } |
1603 |
1603 |
1604 // Verify the bit, for this region, in the actual and expected |
1604 // Verify the bit, for this region, in the actual and expected |
1605 // (which was just calculated) region bit maps. |
1605 // (which was just calculated) region bit maps. |
1606 // We're not OK if the bit in the calculated expected region |
1606 // We're not OK if the bit in the calculated expected region |
1607 // bitmap is set and the bit in the actual region bitmap is not. |
1607 // bitmap is set and the bit in the actual region bitmap is not. |
1608 BitMap::idx_t index = (BitMap::idx_t) hr->hrs_index(); |
1608 BitMap::idx_t index = (BitMap::idx_t) hr->hrm_index(); |
1609 |
1609 |
1610 bool expected = _exp_region_bm->at(index); |
1610 bool expected = _exp_region_bm->at(index); |
1611 bool actual = _region_bm->at(index); |
1611 bool actual = _region_bm->at(index); |
1612 if (expected && !actual) { |
1612 if (expected && !actual) { |
1613 if (_verbose) { |
1613 if (_verbose) { |
1614 gclog_or_tty->print_cr("Region %u: region bitmap mismatch: " |
1614 gclog_or_tty->print_cr("Region %u: region bitmap mismatch: " |
1615 "expected: %s, actual: %s", |
1615 "expected: %s, actual: %s", |
1616 hr->hrs_index(), |
1616 hr->hrm_index(), |
1617 BOOL_TO_STR(expected), BOOL_TO_STR(actual)); |
1617 BOOL_TO_STR(expected), BOOL_TO_STR(actual)); |
1618 } |
1618 } |
1619 failures += 1; |
1619 failures += 1; |
1620 } |
1620 } |
1621 |
1621 |
1632 |
1632 |
1633 if (expected && !actual) { |
1633 if (expected && !actual) { |
1634 if (_verbose) { |
1634 if (_verbose) { |
1635 gclog_or_tty->print_cr("Region %u: card bitmap mismatch at " SIZE_FORMAT ": " |
1635 gclog_or_tty->print_cr("Region %u: card bitmap mismatch at " SIZE_FORMAT ": " |
1636 "expected: %s, actual: %s", |
1636 "expected: %s, actual: %s", |
1637 hr->hrs_index(), i, |
1637 hr->hrm_index(), i, |
1638 BOOL_TO_STR(expected), BOOL_TO_STR(actual)); |
1638 BOOL_TO_STR(expected), BOOL_TO_STR(actual)); |
1639 } |
1639 } |
1640 failures += 1; |
1640 failures += 1; |
1641 } |
1641 } |
1642 } |
1642 } |
3252 } |
3252 } |
3253 |
3253 |
3254 assert(limit_idx <= end_idx, "or else use atomics"); |
3254 assert(limit_idx <= end_idx, "or else use atomics"); |
3255 |
3255 |
3256 // Aggregate the "stripe" in the count data associated with hr. |
3256 // Aggregate the "stripe" in the count data associated with hr. |
3257 uint hrs_index = hr->hrs_index(); |
3257 uint hrm_index = hr->hrm_index(); |
3258 size_t marked_bytes = 0; |
3258 size_t marked_bytes = 0; |
3259 |
3259 |
3260 for (uint i = 0; i < _max_worker_id; i += 1) { |
3260 for (uint i = 0; i < _max_worker_id; i += 1) { |
3261 size_t* marked_bytes_array = _cm->count_marked_bytes_array_for(i); |
3261 size_t* marked_bytes_array = _cm->count_marked_bytes_array_for(i); |
3262 BitMap* task_card_bm = _cm->count_card_bitmap_for(i); |
3262 BitMap* task_card_bm = _cm->count_card_bitmap_for(i); |
3263 |
3263 |
3264 // Fetch the marked_bytes in this region for task i and |
3264 // Fetch the marked_bytes in this region for task i and |
3265 // add it to the running total for this region. |
3265 // add it to the running total for this region. |
3266 marked_bytes += marked_bytes_array[hrs_index]; |
3266 marked_bytes += marked_bytes_array[hrm_index]; |
3267 |
3267 |
3268 // Now union the bitmaps[0,max_worker_id)[start_idx..limit_idx) |
3268 // Now union the bitmaps[0,max_worker_id)[start_idx..limit_idx) |
3269 // into the global card bitmap. |
3269 // into the global card bitmap. |
3270 BitMap::idx_t scan_idx = task_card_bm->get_next_one_offset(start_idx, limit_idx); |
3270 BitMap::idx_t scan_idx = task_card_bm->get_next_one_offset(start_idx, limit_idx); |
3271 |
3271 |