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() { |