| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 2754)
|
| +++ src/heap.cc (working copy)
|
| @@ -2785,6 +2785,39 @@
|
| }
|
|
|
|
|
| +bool Heap::IdleNotification() {
|
| + static const int kIdlesBeforeCollection = 7;
|
| + static int number_idle_notifications = 0;
|
| + static int last_gc_count = gc_count_;
|
| +
|
| + bool finished = false;
|
| +
|
| + if (last_gc_count == gc_count_) {
|
| + number_idle_notifications++;
|
| + } else {
|
| + number_idle_notifications = 0;
|
| + last_gc_count = gc_count_;
|
| + }
|
| +
|
| + if (number_idle_notifications >= kIdlesBeforeCollection) {
|
| + // The first time through we collect without forcing compaction.
|
| + // The second time through we force compaction and quit.
|
| + bool force_compaction =
|
| + number_idle_notifications > kIdlesBeforeCollection;
|
| + CollectAllGarbage(force_compaction);
|
| + last_gc_count = gc_count_;
|
| + if (force_compaction) {
|
| + number_idle_notifications = 0;
|
| + finished = true;
|
| + }
|
| + }
|
| +
|
| + // Uncommit unused memory in new space.
|
| + Heap::UncommitFromSpace();
|
| + return finished;
|
| +}
|
| +
|
| +
|
| #ifdef DEBUG
|
|
|
| void Heap::Print() {
|
|
|