Fix incremental marking speed accelleration and start incremental marking when old space is almost full when pretenuring objects.

BUG=

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14559 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
hpayer@chromium.org 2013-05-06 16:17:49 +00:00
parent 4c1782022a
commit c74ee804b3
2 changed files with 25 additions and 5 deletions

View File

@ -566,7 +566,11 @@ void IncrementalMarking::Start() {
PrintF("[IncrementalMarking] Start\n"); PrintF("[IncrementalMarking] Start\n");
} }
ASSERT(FLAG_incremental_marking); ASSERT(FLAG_incremental_marking);
ASSERT(FLAG_incremental_marking_steps);
ASSERT(state_ == STOPPED); ASSERT(state_ == STOPPED);
ASSERT(heap_->gc_state() == Heap::NOT_IN_GC);
ASSERT(!Serializer::enabled());
ASSERT(heap_->isolate()->IsInitialized());
ResetStepCounters(); ResetStepCounters();
@ -860,6 +864,25 @@ void IncrementalMarking::MarkingComplete(CompletionAction action) {
} }
void IncrementalMarking::OldSpaceStep(intptr_t allocated) {
if (IsStopped() && WorthActivating() && heap_->NextGCIsLikelyToBeFull()) {
// Only start incremental marking in a save state: 1) when we are not in
// a GC, 2) when we turned-on incremental marking, 3) when we are
// currently not serializing or deserializing the heap.
if (heap_->gc_state() != Heap::NOT_IN_GC ||
!FLAG_incremental_marking ||
!FLAG_incremental_marking_steps ||
Serializer::enabled() ||
!heap_->isolate()->IsInitialized()) {
return;
}
Start();
} else {
Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD);
}
}
void IncrementalMarking::Step(intptr_t allocated_bytes, void IncrementalMarking::Step(intptr_t allocated_bytes,
CompletionAction action) { CompletionAction action) {
if (heap_->gc_state() != Heap::NOT_IN_GC || if (heap_->gc_state() != Heap::NOT_IN_GC ||
@ -965,7 +988,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes,
PrintPID("Postponing speeding up marking until marking starts\n"); PrintPID("Postponing speeding up marking until marking starts\n");
} }
} else { } else {
marking_speed_ += kMarkingSpeedAccellerationInterval; marking_speed_ += kMarkingSpeedAccelleration;
marking_speed_ = static_cast<int>( marking_speed_ = static_cast<int>(
Min(kMaxMarkingSpeed, Min(kMaxMarkingSpeed,
static_cast<intptr_t>(marking_speed_ * 1.3))); static_cast<intptr_t>(marking_speed_ * 1.3)));

View File

@ -110,10 +110,7 @@ class IncrementalMarking {
static const intptr_t kMarkingSpeedAccelleration = 2; static const intptr_t kMarkingSpeedAccelleration = 2;
static const intptr_t kMaxMarkingSpeed = 1000; static const intptr_t kMaxMarkingSpeed = 1000;
void OldSpaceStep(intptr_t allocated) { void OldSpaceStep(intptr_t allocated);
Step(allocated * kFastMarking / kInitialMarkingSpeed,
GC_VIA_STACK_GUARD);
}
void Step(intptr_t allocated, CompletionAction action); void Step(intptr_t allocated, CompletionAction action);