提交 31122aaa 编写于 作者: J jcoomes

6786188: par compact - "SplitALot" stress mode should fill to_space

Reviewed-by: jmasa, tonyp
上级 718caf55
...@@ -1472,9 +1472,53 @@ PSParallelCompact::summarize_new_objects(SpaceId id, HeapWord* start) ...@@ -1472,9 +1472,53 @@ PSParallelCompact::summarize_new_objects(SpaceId id, HeapWord* start)
assert(result, "should not fail: bad filler object size"); assert(result, "should not fail: bad filler object size");
} }
void
PSParallelCompact::provoke_split_fill_survivor(SpaceId id)
{
if (total_invocations() % (ParallelOldGCSplitInterval * 3) != 0) {
return;
}
MutableSpace* const space = _space_info[id].space();
if (space->is_empty()) {
HeapWord* b = space->bottom();
HeapWord* t = b + space->capacity_in_words() / 2;
space->set_top(t);
if (ZapUnusedHeapArea) {
space->set_top_for_allocations();
}
size_t obj_len = 8;
while (b + obj_len <= t) {
CollectedHeap::fill_with_object(b, obj_len);
mark_bitmap()->mark_obj(b, obj_len);
summary_data().add_obj(b, obj_len);
b += obj_len;
obj_len = (obj_len & 0x18) + 8; // 8 16 24 32 8 16 24 32 ...
}
if (b < t) {
// The loop didn't completely fill to t (top); adjust top downward.
space->set_top(b);
if (ZapUnusedHeapArea) {
space->set_top_for_allocations();
}
}
HeapWord** nta = _space_info[id].new_top_addr();
bool result = summary_data().summarize(_space_info[id].split_info(),
space->bottom(), space->top(), NULL,
space->bottom(), space->end(), nta);
assert(result, "space must fit into itself");
}
}
void void
PSParallelCompact::provoke_split(bool & max_compaction) PSParallelCompact::provoke_split(bool & max_compaction)
{ {
if (total_invocations() % ParallelOldGCSplitInterval != 0) {
return;
}
const size_t region_size = ParallelCompactData::RegionSize; const size_t region_size = ParallelCompactData::RegionSize;
ParallelCompactData& sd = summary_data(); ParallelCompactData& sd = summary_data();
...@@ -1587,6 +1631,12 @@ void PSParallelCompact::summarize_spaces_quick() ...@@ -1587,6 +1631,12 @@ void PSParallelCompact::summarize_spaces_quick()
assert(result, "space must fit into itself"); assert(result, "space must fit into itself");
_space_info[i].set_dense_prefix(space->bottom()); _space_info[i].set_dense_prefix(space->bottom());
} }
#ifndef PRODUCT
if (ParallelOldGCSplitALot) {
provoke_split_fill_survivor(to_space_id);
}
#endif // #ifndef PRODUCT
} }
void PSParallelCompact::fill_dense_prefix_end(SpaceId id) void PSParallelCompact::fill_dense_prefix_end(SpaceId id)
...@@ -1794,9 +1844,7 @@ void PSParallelCompact::summary_phase(ParCompactionManager* cm, ...@@ -1794,9 +1844,7 @@ void PSParallelCompact::summary_phase(ParCompactionManager* cm,
} }
#ifndef PRODUCT #ifndef PRODUCT
if (ParallelOldGCSplitALot && old_space_total_live < old_capacity) { if (ParallelOldGCSplitALot && old_space_total_live < old_capacity) {
if (total_invocations() % ParallelOldGCSplitInterval == 0) { provoke_split(maximum_compaction);
provoke_split(maximum_compaction);
}
} }
#endif // #ifndef PRODUCT #endif // #ifndef PRODUCT
......
...@@ -978,6 +978,10 @@ class PSParallelCompact : AllStatic { ...@@ -978,6 +978,10 @@ class PSParallelCompact : AllStatic {
// Include the new objects in the summary data. // Include the new objects in the summary data.
static void summarize_new_objects(SpaceId id, HeapWord* start); static void summarize_new_objects(SpaceId id, HeapWord* start);
// Add live objects to a survivor space since it's rare that both survivors
// are non-empty.
static void provoke_split_fill_survivor(SpaceId id);
// Add live objects and/or choose the dense prefix to provoke splitting. // Add live objects and/or choose the dense prefix to provoke splitting.
static void provoke_split(bool & maximum_compaction); static void provoke_split(bool & maximum_compaction);
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册