Chromium Code Reviews| Index: src/heap/mark-compact.cc |
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
| index 2eb9a1b79195f3c38e9b2c1df6f5daf84dac66f1..a60c892612276ec2657c4da7148ec796cc0d7d12 100644 |
| --- a/src/heap/mark-compact.cc |
| +++ b/src/heap/mark-compact.cc |
| @@ -1837,8 +1837,15 @@ class MarkCompactCollector::EvacuateNewSpaceVisitor final |
| class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
| : public MarkCompactCollector::HeapObjectVisitor { |
| public: |
| - explicit EvacuateNewSpacePageVisitor(Heap* heap) |
| - : heap_(heap), promoted_size_(0), semispace_copied_size_(0) {} |
| + enum VisitationMode { kNewToOld, kNewToNew }; |
| + |
| + explicit EvacuateNewSpacePageVisitor( |
| + Heap* heap, base::HashMap* local_pretenuring_feedback) |
| + : heap_(heap), |
| + promoted_size_(0), |
| + semispace_copied_size_(0), |
| + local_pretenuring_feedback_(local_pretenuring_feedback), |
| + mode_(VisitationMode::kNewToNew) {} |
| static void MoveToOldSpace(Page* page, PagedSpace* owner) { |
| page->Unlink(); |
| @@ -1852,23 +1859,32 @@ class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
| } |
| inline bool Visit(HeapObject* object) { |
| - RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
| - object->IterateBodyFast(&visitor); |
| - promoted_size_ += object->Size(); |
| + heap_->UpdateAllocationSite<Heap::kCached>(object, |
| + local_pretenuring_feedback_); |
| + if (mode_ == kNewToOld) { |
| + RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
| + object->IterateBodyFast(&visitor); |
| + } |
| return true; |
| } |
| intptr_t promoted_size() { return promoted_size_; } |
| intptr_t semispace_copied_size() { return semispace_copied_size_; } |
| - void account_semispace_copied(intptr_t copied) { |
| - semispace_copied_size_ += copied; |
| + void account_semispace_copied(intptr_t bytes) { |
| + semispace_copied_size_ += bytes; |
| } |
| + void account_promoted(intptr_t bytes) { promoted_size_ += bytes; } |
| + |
| + void set_mode(VisitationMode mode) { mode_ = mode; } |
| + |
| private: |
| Heap* heap_; |
| intptr_t promoted_size_; |
| intptr_t semispace_copied_size_; |
| + base::HashMap* local_pretenuring_feedback_; |
| + VisitationMode mode_; |
| }; |
| class MarkCompactCollector::EvacuateOldSpaceVisitor final |
| @@ -2925,7 +2941,7 @@ class MarkCompactCollector::Evacuator : public Malloced { |
| local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity), |
| new_space_visitor_(collector->heap(), &compaction_spaces_, |
| &local_pretenuring_feedback_), |
| - new_space_page_visitor(collector->heap()), |
| + new_space_page_visitor(collector->heap(), &local_pretenuring_feedback_), |
| old_space_visitor_(collector->heap(), &compaction_spaces_), |
| duration_(0.0), |
| bytes_compacted_(0) {} |
| @@ -2982,15 +2998,19 @@ bool MarkCompactCollector::Evacuator::EvacuatePage(Page* page) { |
| DCHECK(success); |
| break; |
| case kPageNewToOld: |
| + new_space_page_visitor.set_mode(EvacuateNewSpacePageVisitor::kNewToOld); |
| success = collector_->VisitLiveObjects(page, &new_space_page_visitor, |
| kKeepMarking); |
| + new_space_page_visitor.account_promoted(page->LiveBytes()); |
| // ArrayBufferTracker will be updated during sweeping. |
| DCHECK(success); |
| break; |
| case kPageNewToNew: |
| + new_space_page_visitor.set_mode(EvacuateNewSpacePageVisitor::kNewToNew); |
| + success = collector_->VisitLiveObjects(page, &new_space_page_visitor, |
|
Michael Lippautz
2016/11/10 14:06:02
Measured the impact on ToT splay w/ --gc-global. I
|
| + kKeepMarking); |
| new_space_page_visitor.account_semispace_copied(page->LiveBytes()); |
| // ArrayBufferTracker will be updated during sweeping. |
| - success = true; |
| break; |
| case kObjectsOldToOld: |
| success = collector_->VisitLiveObjects(page, &old_space_visitor_, |
| @@ -3015,8 +3035,6 @@ bool MarkCompactCollector::Evacuator::EvacuatePage(Page* page) { |
| page, ArrayBufferTracker::kUpdateForwardedRemoveOthers); |
| } |
| break; |
| - default: |
| - UNREACHABLE(); |
| } |
| } |
| ReportCompactionProgress(evacuation_time, saved_live_bytes); |