| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
| (...skipping 4249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4260 if (!IsHeapIterable()) { | 4260 if (!IsHeapIterable()) { |
| 4261 CollectAllGarbage(kMakeHeapIterableMask, "Heap::MakeHeapIterable"); | 4261 CollectAllGarbage(kMakeHeapIterableMask, "Heap::MakeHeapIterable"); |
| 4262 } | 4262 } |
| 4263 if (mark_compact_collector()->sweeping_in_progress()) { | 4263 if (mark_compact_collector()->sweeping_in_progress()) { |
| 4264 mark_compact_collector()->EnsureSweepingCompleted(); | 4264 mark_compact_collector()->EnsureSweepingCompleted(); |
| 4265 } | 4265 } |
| 4266 DCHECK(IsHeapIterable()); | 4266 DCHECK(IsHeapIterable()); |
| 4267 } | 4267 } |
| 4268 | 4268 |
| 4269 | 4269 |
| 4270 void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { | 4270 void Heap::TryFinalizeIdleIncrementalMarking( |
| 4271 incremental_marking()->Step(step_size, | 4271 size_t idle_time_in_ms, size_t size_of_objects, |
| 4272 IncrementalMarking::NO_GC_VIA_STACK_GUARD, true); | 4272 size_t mark_compact_speed_in_bytes_per_ms) { |
| 4273 | 4273 if (incremental_marking()->IsComplete() || |
| 4274 if (incremental_marking()->IsComplete()) { | 4274 (mark_compact_collector()->IsMarkingDequeEmpty() && |
| 4275 gc_idle_time_handler_.ShouldDoMarkCompact( |
| 4276 idle_time_in_ms, size_of_objects, |
| 4277 mark_compact_speed_in_bytes_per_ms))) { |
| 4275 bool uncommit = false; | 4278 bool uncommit = false; |
| 4276 if (gc_count_at_last_idle_gc_ == gc_count_) { | 4279 if (gc_count_at_last_idle_gc_ == gc_count_) { |
| 4277 // No GC since the last full GC, the mutator is probably not active. | 4280 // No GC since the last full GC, the mutator is probably not active. |
| 4278 isolate_->compilation_cache()->Clear(); | 4281 isolate_->compilation_cache()->Clear(); |
| 4279 uncommit = true; | 4282 uncommit = true; |
| 4280 } | 4283 } |
| 4281 CollectAllGarbage(kReduceMemoryFootprintMask, | 4284 CollectAllGarbage(kReduceMemoryFootprintMask, |
| 4282 "idle notification: finalize incremental"); | 4285 "idle notification: finalize incremental"); |
| 4283 gc_idle_time_handler_.NotifyIdleMarkCompact(); | 4286 gc_idle_time_handler_.NotifyIdleMarkCompact(); |
| 4284 gc_count_at_last_idle_gc_ = gc_count_; | 4287 gc_count_at_last_idle_gc_ = gc_count_; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4324 heap_state.used_new_space_size = new_space_.Size(); | 4327 heap_state.used_new_space_size = new_space_.Size(); |
| 4325 heap_state.new_space_capacity = new_space_.Capacity(); | 4328 heap_state.new_space_capacity = new_space_.Capacity(); |
| 4326 heap_state.new_space_allocation_throughput_in_bytes_per_ms = | 4329 heap_state.new_space_allocation_throughput_in_bytes_per_ms = |
| 4327 static_cast<size_t>( | 4330 static_cast<size_t>( |
| 4328 tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond()); | 4331 tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond()); |
| 4329 | 4332 |
| 4330 GCIdleTimeAction action = | 4333 GCIdleTimeAction action = |
| 4331 gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state); | 4334 gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state); |
| 4332 | 4335 |
| 4333 bool result = false; | 4336 bool result = false; |
| 4337 int actual_time_in_ms = 0; |
| 4334 switch (action.type) { | 4338 switch (action.type) { |
| 4335 case DONE: | 4339 case DONE: |
| 4336 result = true; | 4340 result = true; |
| 4337 break; | 4341 break; |
| 4338 case DO_INCREMENTAL_MARKING: | 4342 case DO_INCREMENTAL_MARKING: { |
| 4339 if (incremental_marking()->IsStopped()) { | 4343 if (incremental_marking()->IsStopped()) { |
| 4340 incremental_marking()->Start(); | 4344 incremental_marking()->Start(); |
| 4341 } | 4345 } |
| 4342 AdvanceIdleIncrementalMarking(action.parameter); | 4346 incremental_marking()->Step(action.parameter, |
| 4347 IncrementalMarking::NO_GC_VIA_STACK_GUARD, |
| 4348 IncrementalMarking::FORCE_MARKING, |
| 4349 IncrementalMarking::DO_NOT_FORCE_COMPLETION); |
| 4350 actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
| 4351 int remaining_idle_time_in_ms = idle_time_in_ms - actual_time_in_ms; |
| 4352 if (remaining_idle_time_in_ms > 0) { |
| 4353 TryFinalizeIdleIncrementalMarking( |
| 4354 remaining_idle_time_in_ms, heap_state.size_of_objects, |
| 4355 heap_state.mark_compact_speed_in_bytes_per_ms); |
| 4356 } |
| 4343 break; | 4357 break; |
| 4358 } |
| 4344 case DO_FULL_GC: { | 4359 case DO_FULL_GC: { |
| 4345 HistogramTimerScope scope(isolate_->counters()->gc_context()); | 4360 HistogramTimerScope scope(isolate_->counters()->gc_context()); |
| 4346 const char* message = contexts_disposed_ | 4361 const char* message = contexts_disposed_ |
| 4347 ? "idle notification: contexts disposed" | 4362 ? "idle notification: contexts disposed" |
| 4348 : "idle notification: finalize idle round"; | 4363 : "idle notification: finalize idle round"; |
| 4349 CollectAllGarbage(kReduceMemoryFootprintMask, message); | 4364 CollectAllGarbage(kReduceMemoryFootprintMask, message); |
| 4350 gc_idle_time_handler_.NotifyIdleMarkCompact(); | 4365 gc_idle_time_handler_.NotifyIdleMarkCompact(); |
| 4351 break; | 4366 break; |
| 4352 } | 4367 } |
| 4353 case DO_SCAVENGE: | 4368 case DO_SCAVENGE: |
| 4354 CollectGarbage(NEW_SPACE, "idle notification: scavenge"); | 4369 CollectGarbage(NEW_SPACE, "idle notification: scavenge"); |
| 4355 break; | 4370 break; |
| 4356 case DO_FINALIZE_SWEEPING: | 4371 case DO_FINALIZE_SWEEPING: |
| 4357 mark_compact_collector()->EnsureSweepingCompleted(); | 4372 mark_compact_collector()->EnsureSweepingCompleted(); |
| 4358 break; | 4373 break; |
| 4359 case DO_NOTHING: | 4374 case DO_NOTHING: |
| 4360 break; | 4375 break; |
| 4361 } | 4376 } |
| 4362 | 4377 |
| 4363 int actual_time_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); | 4378 actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
| 4364 if (actual_time_ms <= idle_time_in_ms) { | 4379 if (actual_time_in_ms <= idle_time_in_ms) { |
| 4365 if (action.type != DONE && action.type != DO_NOTHING) { | 4380 if (action.type != DONE && action.type != DO_NOTHING) { |
| 4366 isolate()->counters()->gc_idle_time_limit_undershot()->AddSample( | 4381 isolate()->counters()->gc_idle_time_limit_undershot()->AddSample( |
| 4367 idle_time_in_ms - actual_time_ms); | 4382 idle_time_in_ms - actual_time_in_ms); |
| 4368 } | 4383 } |
| 4369 } else { | 4384 } else { |
| 4370 isolate()->counters()->gc_idle_time_limit_overshot()->AddSample( | 4385 isolate()->counters()->gc_idle_time_limit_overshot()->AddSample( |
| 4371 actual_time_ms - idle_time_in_ms); | 4386 actual_time_in_ms - idle_time_in_ms); |
| 4372 } | 4387 } |
| 4373 | 4388 |
| 4374 if (FLAG_trace_idle_notification) { | 4389 if (FLAG_trace_idle_notification) { |
| 4375 PrintF("Idle notification: requested idle time %d ms, actual time %d ms [", | 4390 PrintF("Idle notification: requested idle time %d ms, actual time %d ms [", |
| 4376 idle_time_in_ms, actual_time_ms); | 4391 idle_time_in_ms, actual_time_in_ms); |
| 4377 action.Print(); | 4392 action.Print(); |
| 4378 PrintF("]\n"); | 4393 PrintF("]\n"); |
| 4379 } | 4394 } |
| 4380 | 4395 |
| 4381 contexts_disposed_ = 0; | 4396 contexts_disposed_ = 0; |
| 4382 return result; | 4397 return result; |
| 4383 } | 4398 } |
| 4384 | 4399 |
| 4385 | 4400 |
| 4386 #ifdef DEBUG | 4401 #ifdef DEBUG |
| (...skipping 1766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6153 static_cast<int>(object_sizes_last_time_[index])); | 6168 static_cast<int>(object_sizes_last_time_[index])); |
| 6154 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6169 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 6155 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6170 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 6156 | 6171 |
| 6157 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6172 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 6158 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6173 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 6159 ClearObjectStats(); | 6174 ClearObjectStats(); |
| 6160 } | 6175 } |
| 6161 } | 6176 } |
| 6162 } // namespace v8::internal | 6177 } // namespace v8::internal |
| OLD | NEW |