Precisely sweep scan on scavenge pages and use heap iterator to iterate over them.

BUG=
R=jarin@chromium.org

Review URL: https://codereview.chromium.org/362313002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22154 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
hpayer@chromium.org 2014-07-02 12:19:03 +00:00
parent be0d2fbe1f
commit 4793ec3b7e
2 changed files with 31 additions and 7 deletions

View File

@ -4146,12 +4146,23 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) {
pages_swept++;
parallel_sweeping_active = true;
} else {
if (FLAG_gc_verbose) {
PrintF("Sweeping 0x%" V8PRIxPTR " conservatively in parallel.\n",
reinterpret_cast<intptr_t>(p));
if (p->scan_on_scavenge()) {
SweepPrecisely<SWEEP_ONLY, IGNORE_SKIP_LIST, IGNORE_FREE_SPACE>(
space, p, NULL);
pages_swept++;
if (FLAG_gc_verbose) {
PrintF("Sweeping 0x%" V8PRIxPTR
" scan on scavenge page precisely.\n",
reinterpret_cast<intptr_t>(p));
}
} else {
if (FLAG_gc_verbose) {
PrintF("Sweeping 0x%" V8PRIxPTR " conservatively in parallel.\n",
reinterpret_cast<intptr_t>(p));
}
p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_PENDING);
space->IncreaseUnsweptFreeBytes(p);
}
p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_PENDING);
space->IncreaseUnsweptFreeBytes(p);
}
space->set_end_of_unswept_pages(p);
break;

View File

@ -552,8 +552,21 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback,
FindPointersToNewSpaceInMapsRegion(
start, end, slot_callback, clear_maps);
} else {
FindPointersToNewSpaceInRegion(
start, end, slot_callback, clear_maps);
ASSERT(page->WasSweptPrecisely());
HeapObjectIterator iterator(page, NULL);
for (HeapObject* heap_object = iterator.Next();
heap_object != NULL;
heap_object = iterator.Next()) {
// We skip filler, free space, and constant pool objects.
if (!heap_object->IsFiller() &&
!heap_object->IsConstantPoolArray()) {
FindPointersToNewSpaceInRegion(
heap_object->address() + HeapObject::kHeaderSize,
heap_object->address() + heap_object->Size(),
slot_callback,
clear_maps);
}
}
}
}
}