| OLD | NEW | 
|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 3739 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3750   } | 3750   } | 
| 3751   Struct::cast(result)->InitializeBody(size); | 3751   Struct::cast(result)->InitializeBody(size); | 
| 3752   return result; | 3752   return result; | 
| 3753 } | 3753 } | 
| 3754 | 3754 | 
| 3755 | 3755 | 
| 3756 bool Heap::IdleNotification() { | 3756 bool Heap::IdleNotification() { | 
| 3757   static const int kIdlesBeforeScavenge = 4; | 3757   static const int kIdlesBeforeScavenge = 4; | 
| 3758   static const int kIdlesBeforeMarkSweep = 7; | 3758   static const int kIdlesBeforeMarkSweep = 7; | 
| 3759   static const int kIdlesBeforeMarkCompact = 8; | 3759   static const int kIdlesBeforeMarkCompact = 8; | 
|  | 3760   static const int kMaxIdleCount = 9; | 
|  | 3761   static const int kGCsBetweenCleanup = 4; | 
| 3760   static int number_idle_notifications = 0; | 3762   static int number_idle_notifications = 0; | 
| 3761   static int last_gc_count = gc_count_; | 3763   static int last_gc_count = gc_count_; | 
| 3762 | 3764 | 
| 3763   bool uncommit = true; | 3765   bool uncommit = true; | 
| 3764   bool finished = false; | 3766   bool finished = false; | 
| 3765 | 3767 | 
| 3766   if (last_gc_count == gc_count_) { | 3768   // Reset the number of idle notifications received when a number of | 
| 3767     number_idle_notifications++; | 3769   // GCs have taken place. This allows another round of cleanup based | 
|  | 3770   // on idle notifications if enough work has been carried out to | 
|  | 3771   // provoke a number of garbage collections. | 
|  | 3772   if (gc_count_ < last_gc_count + kGCsBetweenCleanup) { | 
|  | 3773     number_idle_notifications = | 
|  | 3774         Min(number_idle_notifications + 1, kMaxIdleCount); | 
| 3768   } else { | 3775   } else { | 
| 3769     number_idle_notifications = 0; | 3776     number_idle_notifications = 0; | 
| 3770     last_gc_count = gc_count_; | 3777     last_gc_count = gc_count_; | 
| 3771   } | 3778   } | 
| 3772 | 3779 | 
| 3773   if (number_idle_notifications == kIdlesBeforeScavenge) { | 3780   if (number_idle_notifications == kIdlesBeforeScavenge) { | 
| 3774     if (contexts_disposed_ > 0) { | 3781     if (contexts_disposed_ > 0) { | 
| 3775       HistogramTimerScope scope(&Counters::gc_context); | 3782       HistogramTimerScope scope(&Counters::gc_context); | 
| 3776       CollectAllGarbage(false); | 3783       CollectAllGarbage(false); | 
| 3777     } else { | 3784     } else { | 
| 3778       CollectGarbage(NEW_SPACE); | 3785       CollectGarbage(NEW_SPACE); | 
| 3779     } | 3786     } | 
| 3780     new_space_.Shrink(); | 3787     new_space_.Shrink(); | 
| 3781     last_gc_count = gc_count_; | 3788     last_gc_count = gc_count_; | 
| 3782 |  | 
| 3783   } else if (number_idle_notifications == kIdlesBeforeMarkSweep) { | 3789   } else if (number_idle_notifications == kIdlesBeforeMarkSweep) { | 
| 3784     // Before doing the mark-sweep collections we clear the | 3790     // Before doing the mark-sweep collections we clear the | 
| 3785     // compilation cache to avoid hanging on to source code and | 3791     // compilation cache to avoid hanging on to source code and | 
| 3786     // generated code for cached functions. | 3792     // generated code for cached functions. | 
| 3787     CompilationCache::Clear(); | 3793     CompilationCache::Clear(); | 
| 3788 | 3794 | 
| 3789     CollectAllGarbage(false); | 3795     CollectAllGarbage(false); | 
| 3790     new_space_.Shrink(); | 3796     new_space_.Shrink(); | 
| 3791     last_gc_count = gc_count_; | 3797     last_gc_count = gc_count_; | 
| 3792 | 3798 | 
| 3793   } else if (number_idle_notifications == kIdlesBeforeMarkCompact) { | 3799   } else if (number_idle_notifications == kIdlesBeforeMarkCompact) { | 
| 3794     CollectAllGarbage(true); | 3800     CollectAllGarbage(true); | 
| 3795     new_space_.Shrink(); | 3801     new_space_.Shrink(); | 
| 3796     last_gc_count = gc_count_; | 3802     last_gc_count = gc_count_; | 
| 3797     number_idle_notifications = 0; |  | 
| 3798     finished = true; | 3803     finished = true; | 
| 3799 | 3804 | 
| 3800   } else if (contexts_disposed_ > 0) { | 3805   } else if (contexts_disposed_ > 0) { | 
| 3801     if (FLAG_expose_gc) { | 3806     if (FLAG_expose_gc) { | 
| 3802       contexts_disposed_ = 0; | 3807       contexts_disposed_ = 0; | 
| 3803     } else { | 3808     } else { | 
| 3804       HistogramTimerScope scope(&Counters::gc_context); | 3809       HistogramTimerScope scope(&Counters::gc_context); | 
| 3805       CollectAllGarbage(false); | 3810       CollectAllGarbage(false); | 
| 3806       last_gc_count = gc_count_; | 3811       last_gc_count = gc_count_; | 
| 3807     } | 3812     } | 
| 3808     // If this is the first idle notification, we reset the | 3813     // If this is the first idle notification, we reset the | 
| 3809     // notification count to avoid letting idle notifications for | 3814     // notification count to avoid letting idle notifications for | 
| 3810     // context disposal garbage collections start a potentially too | 3815     // context disposal garbage collections start a potentially too | 
| 3811     // aggressive idle GC cycle. | 3816     // aggressive idle GC cycle. | 
| 3812     if (number_idle_notifications <= 1) { | 3817     if (number_idle_notifications <= 1) { | 
| 3813       number_idle_notifications = 0; | 3818       number_idle_notifications = 0; | 
| 3814       uncommit = false; | 3819       uncommit = false; | 
| 3815     } | 3820     } | 
|  | 3821   } else if (number_idle_notifications > kIdlesBeforeMarkCompact) { | 
|  | 3822     // If we have received more than kIdlesBeforeMarkCompact idle | 
|  | 3823     // notifications we do not perform any cleanup because we don't | 
|  | 3824     // expect to gain much by doing so. | 
|  | 3825     finished = true; | 
| 3816   } | 3826   } | 
| 3817 | 3827 | 
| 3818   // Make sure that we have no pending context disposals and | 3828   // Make sure that we have no pending context disposals and | 
| 3819   // conditionally uncommit from space. | 3829   // conditionally uncommit from space. | 
| 3820   ASSERT(contexts_disposed_ == 0); | 3830   ASSERT(contexts_disposed_ == 0); | 
| 3821   if (uncommit) Heap::UncommitFromSpace(); | 3831   if (uncommit) Heap::UncommitFromSpace(); | 
| 3822   return finished; | 3832   return finished; | 
| 3823 } | 3833 } | 
| 3824 | 3834 | 
| 3825 | 3835 | 
| (...skipping 1612 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5438 void ExternalStringTable::TearDown() { | 5448 void ExternalStringTable::TearDown() { | 
| 5439   new_space_strings_.Free(); | 5449   new_space_strings_.Free(); | 
| 5440   old_space_strings_.Free(); | 5450   old_space_strings_.Free(); | 
| 5441 } | 5451 } | 
| 5442 | 5452 | 
| 5443 | 5453 | 
| 5444 List<Object*> ExternalStringTable::new_space_strings_; | 5454 List<Object*> ExternalStringTable::new_space_strings_; | 
| 5445 List<Object*> ExternalStringTable::old_space_strings_; | 5455 List<Object*> ExternalStringTable::old_space_strings_; | 
| 5446 | 5456 | 
| 5447 } }  // namespace v8::internal | 5457 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|