Make idle notification cleanup less aggressive. Do not clean up on
idle notifications after the one that causes the mark-compact collection unless four or more garbage collections (scavenges) have occurred. The embedder should stop sending idle notifications once V8 returns true from the IdleNotification call. This change is being defensive so it will not hurt as badly if embedders continue to send idle notifications. Review URL: http://codereview.chromium.org/5726005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5981 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ad0401174a
commit
1e494335bb
18
src/heap.cc
18
src/heap.cc
@ -3757,14 +3757,21 @@ bool Heap::IdleNotification() {
|
||||
static const int kIdlesBeforeScavenge = 4;
|
||||
static const int kIdlesBeforeMarkSweep = 7;
|
||||
static const int kIdlesBeforeMarkCompact = 8;
|
||||
static const int kMaxIdleCount = kIdlesBeforeMarkCompact + 1;
|
||||
static const int kGCsBetweenCleanup = 4;
|
||||
static int number_idle_notifications = 0;
|
||||
static int last_gc_count = gc_count_;
|
||||
|
||||
bool uncommit = true;
|
||||
bool finished = false;
|
||||
|
||||
if (last_gc_count == gc_count_) {
|
||||
number_idle_notifications++;
|
||||
// Reset the number of idle notifications received when a number of
|
||||
// GCs have taken place. This allows another round of cleanup based
|
||||
// on idle notifications if enough work has been carried out to
|
||||
// provoke a number of garbage collections.
|
||||
if (gc_count_ < last_gc_count + kGCsBetweenCleanup) {
|
||||
number_idle_notifications =
|
||||
Min(number_idle_notifications + 1, kMaxIdleCount);
|
||||
} else {
|
||||
number_idle_notifications = 0;
|
||||
last_gc_count = gc_count_;
|
||||
@ -3779,7 +3786,6 @@ bool Heap::IdleNotification() {
|
||||
}
|
||||
new_space_.Shrink();
|
||||
last_gc_count = gc_count_;
|
||||
|
||||
} else if (number_idle_notifications == kIdlesBeforeMarkSweep) {
|
||||
// Before doing the mark-sweep collections we clear the
|
||||
// compilation cache to avoid hanging on to source code and
|
||||
@ -3794,7 +3800,6 @@ bool Heap::IdleNotification() {
|
||||
CollectAllGarbage(true);
|
||||
new_space_.Shrink();
|
||||
last_gc_count = gc_count_;
|
||||
number_idle_notifications = 0;
|
||||
finished = true;
|
||||
|
||||
} else if (contexts_disposed_ > 0) {
|
||||
@ -3813,6 +3818,11 @@ bool Heap::IdleNotification() {
|
||||
number_idle_notifications = 0;
|
||||
uncommit = false;
|
||||
}
|
||||
} else if (number_idle_notifications > kIdlesBeforeMarkCompact) {
|
||||
// If we have received more than kIdlesBeforeMarkCompact idle
|
||||
// notifications we do not perform any cleanup because we don't
|
||||
// expect to gain much by doing so.
|
||||
finished = true;
|
||||
}
|
||||
|
||||
// Make sure that we have no pending context disposals and
|
||||
|
Loading…
Reference in New Issue
Block a user