OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/heap/gc-tracer.h" | 5 #include "src/heap/gc-tracer.h" |
6 | 6 |
7 #include "src/counters.h" | 7 #include "src/counters.h" |
8 #include "src/heap/heap-inl.h" | 8 #include "src/heap/heap-inl.h" |
9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
10 | 10 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 new_space_allocation_in_bytes_since_gc_ = 0; | 302 new_space_allocation_in_bytes_since_gc_ = 0; |
303 old_generation_allocation_in_bytes_since_gc_ = 0; | 303 old_generation_allocation_in_bytes_since_gc_ = 0; |
304 } | 304 } |
305 | 305 |
306 | 306 |
307 void GCTracer::AddContextDisposalTime(double time) { | 307 void GCTracer::AddContextDisposalTime(double time) { |
308 context_disposal_events_.push_front(ContextDisposalEvent(time)); | 308 context_disposal_events_.push_front(ContextDisposalEvent(time)); |
309 } | 309 } |
310 | 310 |
311 | 311 |
| 312 void GCTracer::AddCompactionEvent(double duration, |
| 313 intptr_t live_bytes_compacted) { |
| 314 compaction_events_.push_front( |
| 315 CompactionEvent(duration, live_bytes_compacted)); |
| 316 } |
| 317 |
| 318 |
312 void GCTracer::AddSurvivalRatio(double promotion_ratio) { | 319 void GCTracer::AddSurvivalRatio(double promotion_ratio) { |
313 survival_events_.push_front(SurvivalEvent(promotion_ratio)); | 320 survival_events_.push_front(SurvivalEvent(promotion_ratio)); |
314 } | 321 } |
315 | 322 |
316 | 323 |
317 void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) { | 324 void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) { |
318 cumulative_incremental_marking_steps_++; | 325 cumulative_incremental_marking_steps_++; |
319 cumulative_incremental_marking_bytes_ += bytes; | 326 cumulative_incremental_marking_bytes_ += bytes; |
320 cumulative_incremental_marking_duration_ += duration; | 327 cumulative_incremental_marking_duration_ += duration; |
321 longest_incremental_marking_step_ = | 328 longest_incremental_marking_step_ = |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 "d " | 535 "d " |
529 "nodes_died_in_new=%d " | 536 "nodes_died_in_new=%d " |
530 "nodes_copied_in_new=%d " | 537 "nodes_copied_in_new=%d " |
531 "nodes_promoted=%d " | 538 "nodes_promoted=%d " |
532 "promotion_ratio=%.1f%% " | 539 "promotion_ratio=%.1f%% " |
533 "average_survival_ratio=%.1f%% " | 540 "average_survival_ratio=%.1f%% " |
534 "promotion_rate=%.1f%% " | 541 "promotion_rate=%.1f%% " |
535 "semi_space_copy_rate=%.1f%% " | 542 "semi_space_copy_rate=%.1f%% " |
536 "new_space_allocation_throughput=%" V8_PTR_PREFIX | 543 "new_space_allocation_throughput=%" V8_PTR_PREFIX |
537 "d " | 544 "d " |
538 "context_disposal_rate=%.1f\n", | 545 "context_disposal_rate=%.1f " |
| 546 "compaction_speed=%" V8_PTR_PREFIX "d\n", |
539 heap_->isolate()->time_millis_since_init(), duration, | 547 heap_->isolate()->time_millis_since_init(), duration, |
540 spent_in_mutator, current_.TypeName(true), | 548 spent_in_mutator, current_.TypeName(true), |
541 current_.reduce_memory, current_.scopes[Scope::EXTERNAL], | 549 current_.reduce_memory, current_.scopes[Scope::EXTERNAL], |
542 current_.scopes[Scope::MC_MARK], | 550 current_.scopes[Scope::MC_MARK], |
543 current_.scopes[Scope::MC_MARK_FINISH_INCREMENTAL], | 551 current_.scopes[Scope::MC_MARK_FINISH_INCREMENTAL], |
544 current_.scopes[Scope::MC_MARK_PREPARE_CODE_FLUSH], | 552 current_.scopes[Scope::MC_MARK_PREPARE_CODE_FLUSH], |
545 current_.scopes[Scope::MC_MARK_ROOT], | 553 current_.scopes[Scope::MC_MARK_ROOT], |
546 current_.scopes[Scope::MC_MARK_TOPOPT], | 554 current_.scopes[Scope::MC_MARK_TOPOPT], |
547 current_.scopes[Scope::MC_MARK_RETAIN_MAPS], | 555 current_.scopes[Scope::MC_MARK_RETAIN_MAPS], |
548 current_.scopes[Scope::MC_MARK_WEAK_CLOSURE], | 556 current_.scopes[Scope::MC_MARK_WEAK_CLOSURE], |
(...skipping 29 matching lines...) Expand all Loading... |
578 IncrementalMarkingSpeedInBytesPerMillisecond(), | 586 IncrementalMarkingSpeedInBytesPerMillisecond(), |
579 current_.start_object_size, current_.end_object_size, | 587 current_.start_object_size, current_.end_object_size, |
580 current_.start_holes_size, current_.end_holes_size, | 588 current_.start_holes_size, current_.end_holes_size, |
581 allocated_since_last_gc, heap_->promoted_objects_size(), | 589 allocated_since_last_gc, heap_->promoted_objects_size(), |
582 heap_->semi_space_copied_object_size(), | 590 heap_->semi_space_copied_object_size(), |
583 heap_->nodes_died_in_new_space_, | 591 heap_->nodes_died_in_new_space_, |
584 heap_->nodes_copied_in_new_space_, heap_->nodes_promoted_, | 592 heap_->nodes_copied_in_new_space_, heap_->nodes_promoted_, |
585 heap_->promotion_ratio_, AverageSurvivalRatio(), | 593 heap_->promotion_ratio_, AverageSurvivalRatio(), |
586 heap_->promotion_rate_, heap_->semi_space_copied_rate_, | 594 heap_->promotion_rate_, heap_->semi_space_copied_rate_, |
587 NewSpaceAllocationThroughputInBytesPerMillisecond(), | 595 NewSpaceAllocationThroughputInBytesPerMillisecond(), |
588 ContextDisposalRateInMilliseconds()); | 596 ContextDisposalRateInMilliseconds(), |
| 597 CompactionSpeedInBytesPerMillisecond()); |
589 break; | 598 break; |
590 case Event::START: | 599 case Event::START: |
591 break; | 600 break; |
592 default: | 601 default: |
593 UNREACHABLE(); | 602 UNREACHABLE(); |
594 } | 603 } |
595 } | 604 } |
596 | 605 |
597 | 606 |
598 double GCTracer::MeanDuration(const EventBuffer& events) const { | 607 double GCTracer::MeanDuration(const EventBuffer& events) const { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 durations += iter->end_time - iter->start_time; | 708 durations += iter->end_time - iter->start_time; |
700 ++iter; | 709 ++iter; |
701 } | 710 } |
702 | 711 |
703 if (durations == 0.0) return 0; | 712 if (durations == 0.0) return 0; |
704 // Make sure the result is at least 1. | 713 // Make sure the result is at least 1. |
705 return Max<size_t>(static_cast<size_t>(bytes / durations + 0.5), 1); | 714 return Max<size_t>(static_cast<size_t>(bytes / durations + 0.5), 1); |
706 } | 715 } |
707 | 716 |
708 | 717 |
| 718 intptr_t GCTracer::CompactionSpeedInBytesPerMillisecond() const { |
| 719 if (compaction_events_.size() < kRingBufferMaxSize) return 0.0; |
| 720 intptr_t bytes = 0; |
| 721 double durations = 0.0; |
| 722 CompactionEventBuffer::const_iterator iter = compaction_events_.begin(); |
| 723 while (iter != compaction_events_.end()) { |
| 724 bytes += iter->live_bytes_compacted; |
| 725 durations += iter->duration; |
| 726 ++iter; |
| 727 } |
| 728 |
| 729 if (durations == 0.0) return 0; |
| 730 // Make sure the result is at least 1. |
| 731 return Max<intptr_t>(static_cast<intptr_t>(bytes / durations + 0.5), 1); |
| 732 } |
| 733 |
| 734 |
709 intptr_t GCTracer::MarkCompactSpeedInBytesPerMillisecond() const { | 735 intptr_t GCTracer::MarkCompactSpeedInBytesPerMillisecond() const { |
710 intptr_t bytes = 0; | 736 intptr_t bytes = 0; |
711 double durations = 0.0; | 737 double durations = 0.0; |
712 EventBuffer::const_iterator iter = mark_compactor_events_.begin(); | 738 EventBuffer::const_iterator iter = mark_compactor_events_.begin(); |
713 while (iter != mark_compactor_events_.end()) { | 739 while (iter != mark_compactor_events_.end()) { |
714 bytes += iter->start_object_size; | 740 bytes += iter->start_object_size; |
715 durations += iter->end_time - iter->start_time; | 741 durations += iter->end_time - iter->start_time; |
716 ++iter; | 742 ++iter; |
717 } | 743 } |
718 | 744 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 | 877 |
852 | 878 |
853 bool GCTracer::SurvivalEventsRecorded() const { | 879 bool GCTracer::SurvivalEventsRecorded() const { |
854 return survival_events_.size() > 0; | 880 return survival_events_.size() > 0; |
855 } | 881 } |
856 | 882 |
857 | 883 |
858 void GCTracer::ResetSurvivalEvents() { survival_events_.reset(); } | 884 void GCTracer::ResetSurvivalEvents() { survival_events_.reset(); } |
859 } // namespace internal | 885 } // namespace internal |
860 } // namespace v8 | 886 } // namespace v8 |
OLD | NEW |