Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1254)

Side by Side Diff: src/heap.cc

Issue 698003: Experimental change to idle notifications: Try to limit the... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 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 3058 matching lines...) Expand 10 before | Expand all | Expand 10 after
3069 } 3069 }
3070 3070
3071 3071
3072 bool Heap::IdleNotification() { 3072 bool Heap::IdleNotification() {
3073 static const int kIdlesBeforeScavenge = 4; 3073 static const int kIdlesBeforeScavenge = 4;
3074 static const int kIdlesBeforeMarkSweep = 7; 3074 static const int kIdlesBeforeMarkSweep = 7;
3075 static const int kIdlesBeforeMarkCompact = 8; 3075 static const int kIdlesBeforeMarkCompact = 8;
3076 static int number_idle_notifications = 0; 3076 static int number_idle_notifications = 0;
3077 static int last_gc_count = gc_count_; 3077 static int last_gc_count = gc_count_;
3078 3078
3079 if (!FLAG_expose_gc && (contexts_disposed_ > 0)) { 3079 bool uncommit = true;
3080 HistogramTimerScope scope(&Counters::gc_context);
3081 CollectAllGarbage(false);
3082 ASSERT(contexts_disposed_ == 0);
3083 last_gc_count = gc_count_;
3084 return false;
3085 }
3086
3087 bool finished = false; 3080 bool finished = false;
3088 3081
3089 if (last_gc_count == gc_count_) { 3082 if (last_gc_count == gc_count_) {
3090 number_idle_notifications++; 3083 number_idle_notifications++;
3091 } else { 3084 } else {
3092 number_idle_notifications = 0; 3085 number_idle_notifications = 0;
3093 last_gc_count = gc_count_; 3086 last_gc_count = gc_count_;
3094 } 3087 }
3095 3088
3096 if (number_idle_notifications == kIdlesBeforeScavenge) { 3089 if (number_idle_notifications == kIdlesBeforeScavenge) {
3097 CollectGarbage(0, NEW_SPACE); 3090 if (contexts_disposed_ > 0) {
3091 HistogramTimerScope scope(&Counters::gc_context);
3092 CollectAllGarbage(false);
3093 } else {
3094 CollectGarbage(0, NEW_SPACE);
3095 }
3098 new_space_.Shrink(); 3096 new_space_.Shrink();
3099 last_gc_count = gc_count_; 3097 last_gc_count = gc_count_;
3100 3098
3101 } else if (number_idle_notifications == kIdlesBeforeMarkSweep) { 3099 } else if (number_idle_notifications == kIdlesBeforeMarkSweep) {
3102 // Before doing the mark-sweep collections we clear the 3100 // Before doing the mark-sweep collections we clear the
3103 // compilation cache to avoid hanging on to source code and 3101 // compilation cache to avoid hanging on to source code and
3104 // generated code for cached functions. 3102 // generated code for cached functions.
3105 CompilationCache::Clear(); 3103 CompilationCache::Clear();
3106 3104
3107 CollectAllGarbage(false); 3105 CollectAllGarbage(false);
3108 new_space_.Shrink(); 3106 new_space_.Shrink();
3109 last_gc_count = gc_count_; 3107 last_gc_count = gc_count_;
3110 3108
3111 } else if (number_idle_notifications == kIdlesBeforeMarkCompact) { 3109 } else if (number_idle_notifications == kIdlesBeforeMarkCompact) {
3112 CollectAllGarbage(true); 3110 CollectAllGarbage(true);
3113 new_space_.Shrink(); 3111 new_space_.Shrink();
3114 last_gc_count = gc_count_; 3112 last_gc_count = gc_count_;
3115 number_idle_notifications = 0; 3113 number_idle_notifications = 0;
3116 finished = true; 3114 finished = true;
3115
3116 } else if (contexts_disposed_ > 0) {
3117 if (FLAG_expose_gc) {
3118 contexts_disposed_ = 0;
3119 } else {
3120 HistogramTimerScope scope(&Counters::gc_context);
3121 CollectAllGarbage(false);
3122 last_gc_count = gc_count_;
3123 }
3124 // If this is the first idle notification, we reset the
3125 // notification count to avoid letting idle notifications for
3126 // context disposal garbage collections start a potentially too
3127 // aggressive idle GC cycle.
3128 if (number_idle_notifications <= 1) {
3129 number_idle_notifications = 0;
3130 uncommit = false;
3131 }
3117 } 3132 }
3118 3133
3119 // Uncommit unused memory in new space. 3134 // Make sure that we have no pending context disposals and
3120 Heap::UncommitFromSpace(); 3135 // conditionally uncommit from space.
3136 ASSERT(contexts_disposed_ == 0);
3137 if (uncommit) Heap::UncommitFromSpace();
3121 return finished; 3138 return finished;
3122 } 3139 }
3123 3140
3124 3141
3125 #ifdef DEBUG 3142 #ifdef DEBUG
3126 3143
3127 void Heap::Print() { 3144 void Heap::Print() {
3128 if (!HasBeenSetup()) return; 3145 if (!HasBeenSetup()) return;
3129 Top::PrintStack(); 3146 Top::PrintStack();
3130 AllSpaces spaces; 3147 AllSpaces spaces;
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4234 void ExternalStringTable::TearDown() { 4251 void ExternalStringTable::TearDown() {
4235 new_space_strings_.Free(); 4252 new_space_strings_.Free();
4236 old_space_strings_.Free(); 4253 old_space_strings_.Free();
4237 } 4254 }
4238 4255
4239 4256
4240 List<Object*> ExternalStringTable::new_space_strings_; 4257 List<Object*> ExternalStringTable::new_space_strings_;
4241 List<Object*> ExternalStringTable::old_space_strings_; 4258 List<Object*> ExternalStringTable::old_space_strings_;
4242 4259
4243 } } // namespace v8::internal 4260 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698