Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @ 496:b27c885f75f9
6786188: par compact - "SplitALot" stress mode should fill to_space
Reviewed-by: jmasa, tonyp
author | jcoomes |
---|---|
date | Thu, 18 Dec 2008 10:54:01 -0800 |
parents | 234c22e54b98 |
children | 05c6d52fa7a9 |
comparison
equal
deleted
inserted
replaced
495:234c22e54b98 | 496:b27c885f75f9 |
---|---|
1471 _space_info[id].new_top_addr()); | 1471 _space_info[id].new_top_addr()); |
1472 assert(result, "should not fail: bad filler object size"); | 1472 assert(result, "should not fail: bad filler object size"); |
1473 } | 1473 } |
1474 | 1474 |
1475 void | 1475 void |
1476 PSParallelCompact::provoke_split_fill_survivor(SpaceId id) | |
1477 { | |
1478 if (total_invocations() % (ParallelOldGCSplitInterval * 3) != 0) { | |
1479 return; | |
1480 } | |
1481 | |
1482 MutableSpace* const space = _space_info[id].space(); | |
1483 if (space->is_empty()) { | |
1484 HeapWord* b = space->bottom(); | |
1485 HeapWord* t = b + space->capacity_in_words() / 2; | |
1486 space->set_top(t); | |
1487 if (ZapUnusedHeapArea) { | |
1488 space->set_top_for_allocations(); | |
1489 } | |
1490 | |
1491 size_t obj_len = 8; | |
1492 while (b + obj_len <= t) { | |
1493 CollectedHeap::fill_with_object(b, obj_len); | |
1494 mark_bitmap()->mark_obj(b, obj_len); | |
1495 summary_data().add_obj(b, obj_len); | |
1496 b += obj_len; | |
1497 obj_len = (obj_len & 0x18) + 8; // 8 16 24 32 8 16 24 32 ... | |
1498 } | |
1499 if (b < t) { | |
1500 // The loop didn't completely fill to t (top); adjust top downward. | |
1501 space->set_top(b); | |
1502 if (ZapUnusedHeapArea) { | |
1503 space->set_top_for_allocations(); | |
1504 } | |
1505 } | |
1506 | |
1507 HeapWord** nta = _space_info[id].new_top_addr(); | |
1508 bool result = summary_data().summarize(_space_info[id].split_info(), | |
1509 space->bottom(), space->top(), NULL, | |
1510 space->bottom(), space->end(), nta); | |
1511 assert(result, "space must fit into itself"); | |
1512 } | |
1513 } | |
1514 | |
1515 void | |
1476 PSParallelCompact::provoke_split(bool & max_compaction) | 1516 PSParallelCompact::provoke_split(bool & max_compaction) |
1477 { | 1517 { |
1518 if (total_invocations() % ParallelOldGCSplitInterval != 0) { | |
1519 return; | |
1520 } | |
1521 | |
1478 const size_t region_size = ParallelCompactData::RegionSize; | 1522 const size_t region_size = ParallelCompactData::RegionSize; |
1479 ParallelCompactData& sd = summary_data(); | 1523 ParallelCompactData& sd = summary_data(); |
1480 | 1524 |
1481 MutableSpace* const eden_space = _space_info[eden_space_id].space(); | 1525 MutableSpace* const eden_space = _space_info[eden_space_id].space(); |
1482 MutableSpace* const from_space = _space_info[from_space_id].space(); | 1526 MutableSpace* const from_space = _space_info[from_space_id].space(); |
1585 space->bottom(), space->top(), NULL, | 1629 space->bottom(), space->top(), NULL, |
1586 space->bottom(), space->end(), nta); | 1630 space->bottom(), space->end(), nta); |
1587 assert(result, "space must fit into itself"); | 1631 assert(result, "space must fit into itself"); |
1588 _space_info[i].set_dense_prefix(space->bottom()); | 1632 _space_info[i].set_dense_prefix(space->bottom()); |
1589 } | 1633 } |
1634 | |
1635 #ifndef PRODUCT | |
1636 if (ParallelOldGCSplitALot) { | |
1637 provoke_split_fill_survivor(to_space_id); | |
1638 } | |
1639 #endif // #ifndef PRODUCT | |
1590 } | 1640 } |
1591 | 1641 |
1592 void PSParallelCompact::fill_dense_prefix_end(SpaceId id) | 1642 void PSParallelCompact::fill_dense_prefix_end(SpaceId id) |
1593 { | 1643 { |
1594 HeapWord* const dense_prefix_end = dense_prefix(id); | 1644 HeapWord* const dense_prefix_end = dense_prefix(id); |
1792 // XXX - should also try to expand | 1842 // XXX - should also try to expand |
1793 maximum_compaction = true; | 1843 maximum_compaction = true; |
1794 } | 1844 } |
1795 #ifndef PRODUCT | 1845 #ifndef PRODUCT |
1796 if (ParallelOldGCSplitALot && old_space_total_live < old_capacity) { | 1846 if (ParallelOldGCSplitALot && old_space_total_live < old_capacity) { |
1797 if (total_invocations() % ParallelOldGCSplitInterval == 0) { | 1847 provoke_split(maximum_compaction); |
1798 provoke_split(maximum_compaction); | |
1799 } | |
1800 } | 1848 } |
1801 #endif // #ifndef PRODUCT | 1849 #endif // #ifndef PRODUCT |
1802 | 1850 |
1803 // Permanent and Old generations. | 1851 // Permanent and Old generations. |
1804 summarize_space(perm_space_id, maximum_compaction); | 1852 summarize_space(perm_space_id, maximum_compaction); |