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

Side by Side Diff: src/heap/gc-tracer.cc

Issue 1839993002: [heap] Fix scavenger --trace-gc-nvp glitches. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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
« no previous file with comments | « src/heap/gc-tracer.h ('k') | 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 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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 old_generation_allocation_counter_bytes_ = old_generation_counter_bytes; 328 old_generation_allocation_counter_bytes_ = old_generation_counter_bytes;
329 allocation_duration_since_gc_ += duration; 329 allocation_duration_since_gc_ += duration;
330 new_space_allocation_in_bytes_since_gc_ += new_space_allocated_bytes; 330 new_space_allocation_in_bytes_since_gc_ += new_space_allocated_bytes;
331 old_generation_allocation_in_bytes_since_gc_ += 331 old_generation_allocation_in_bytes_since_gc_ +=
332 old_generation_allocated_bytes; 332 old_generation_allocated_bytes;
333 } 333 }
334 334
335 335
336 void GCTracer::AddAllocation(double current_ms) { 336 void GCTracer::AddAllocation(double current_ms) {
337 allocation_time_ms_ = current_ms; 337 allocation_time_ms_ = current_ms;
338 new_space_allocation_events_.push_front(AllocationEvent( 338 if (allocation_duration_since_gc_ > 0) {
339 allocation_duration_since_gc_, new_space_allocation_in_bytes_since_gc_)); 339 new_space_allocation_events_.push_front(
340 old_generation_allocation_events_.push_front( 340 AllocationEvent(allocation_duration_since_gc_,
341 AllocationEvent(allocation_duration_since_gc_, 341 new_space_allocation_in_bytes_since_gc_));
342 old_generation_allocation_in_bytes_since_gc_)); 342 old_generation_allocation_events_.push_front(
343 AllocationEvent(allocation_duration_since_gc_,
344 old_generation_allocation_in_bytes_since_gc_));
345 }
343 allocation_duration_since_gc_ = 0; 346 allocation_duration_since_gc_ = 0;
344 new_space_allocation_in_bytes_since_gc_ = 0; 347 new_space_allocation_in_bytes_since_gc_ = 0;
345 old_generation_allocation_in_bytes_since_gc_ = 0; 348 old_generation_allocation_in_bytes_since_gc_ = 0;
346 } 349 }
347 350
348 351
349 void GCTracer::AddContextDisposalTime(double time) { 352 void GCTracer::AddContextDisposalTime(double time) {
350 context_disposal_events_.push_front(ContextDisposalEvent(time)); 353 context_disposal_events_.push_front(ContextDisposalEvent(time));
351 } 354 }
352 355
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 "mutator=%.1f " 465 "mutator=%.1f "
463 "gc=%s " 466 "gc=%s "
464 "reduce_memory=%d " 467 "reduce_memory=%d "
465 "scavenge=%.2f " 468 "scavenge=%.2f "
466 "old_new=%.2f " 469 "old_new=%.2f "
467 "weak=%.2f " 470 "weak=%.2f "
468 "roots=%.2f " 471 "roots=%.2f "
469 "code=%.2f " 472 "code=%.2f "
470 "semispace=%.2f " 473 "semispace=%.2f "
471 "object_groups=%.2f " 474 "object_groups=%.2f "
472 "external_prologue=$.2f " 475 "external_prologue=%.2f "
473 "external_epilogue=$.2f " 476 "external_epilogue=%.2f "
474 "external_weak_global_handles=$.2f " 477 "external_weak_global_handles=%.2f "
475 "steps_count=%d " 478 "steps_count=%d "
476 "steps_took=%.1f " 479 "steps_took=%.1f "
477 "scavenge_throughput=%" V8_PTR_PREFIX 480 "scavenge_throughput=%" V8_PTR_PREFIX
478 "d " 481 "d "
479 "total_size_before=%" V8_PTR_PREFIX 482 "total_size_before=%" V8_PTR_PREFIX
480 "d " 483 "d "
481 "total_size_after=%" V8_PTR_PREFIX 484 "total_size_after=%" V8_PTR_PREFIX
482 "d " 485 "d "
483 "holes_size_before=%" V8_PTR_PREFIX 486 "holes_size_before=%" V8_PTR_PREFIX
484 "d " 487 "d "
485 "holes_size_after=%" V8_PTR_PREFIX 488 "holes_size_after=%" V8_PTR_PREFIX
486 "d " 489 "d "
487 "allocated=%" V8_PTR_PREFIX 490 "allocated=%" V8_PTR_PREFIX
488 "d " 491 "d "
489 "promoted=%" V8_PTR_PREFIX 492 "promoted=%" V8_PTR_PREFIX
490 "d " 493 "d "
491 "semi_space_copied=%" V8_PTR_PREFIX 494 "semi_space_copied=%" V8_PTR_PREFIX
492 "d " 495 "d "
493 "nodes_died_in_new=%d " 496 "nodes_died_in_new=%d "
494 "nodes_copied_in_new=%d " 497 "nodes_copied_in_new=%d "
495 "nodes_promoted=%d " 498 "nodes_promoted=%d "
496 "promotion_ratio=%.1f%% " 499 "promotion_ratio=%.1f%% "
497 "average_survival_ratio=%.1f%% " 500 "average_survival_ratio=%.1f%% "
498 "promotion_rate=%.1f%% " 501 "promotion_rate=%.1f%% "
499 "semi_space_copy_rate=%.1f%% " 502 "semi_space_copy_rate=%.1f%% "
500 "new_space_allocation_throughput=%" V8_PTR_PREFIX 503 "new_space_allocation_throughput=%.1f "
501 "d "
502 "context_disposal_rate=%.1f\n", 504 "context_disposal_rate=%.1f\n",
503 heap_->isolate()->time_millis_since_init(), duration, 505 heap_->isolate()->time_millis_since_init(), duration,
504 spent_in_mutator, current_.TypeName(true), 506 spent_in_mutator, current_.TypeName(true),
505 current_.reduce_memory, 507 current_.reduce_memory,
506 current_.scopes[Scope::SCAVENGER_SCAVENGE], 508 current_.scopes[Scope::SCAVENGER_SCAVENGE],
507 current_.scopes[Scope::SCAVENGER_OLD_TO_NEW_POINTERS], 509 current_.scopes[Scope::SCAVENGER_OLD_TO_NEW_POINTERS],
508 current_.scopes[Scope::SCAVENGER_WEAK], 510 current_.scopes[Scope::SCAVENGER_WEAK],
509 current_.scopes[Scope::SCAVENGER_ROOTS], 511 current_.scopes[Scope::SCAVENGER_ROOTS],
510 current_.scopes[Scope::SCAVENGER_CODE_FLUSH_CANDIDATES], 512 current_.scopes[Scope::SCAVENGER_CODE_FLUSH_CANDIDATES],
511 current_.scopes[Scope::SCAVENGER_SEMISPACE], 513 current_.scopes[Scope::SCAVENGER_SEMISPACE],
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 "d " 596 "d "
595 "semi_space_copied=%" V8_PTR_PREFIX 597 "semi_space_copied=%" V8_PTR_PREFIX
596 "d " 598 "d "
597 "nodes_died_in_new=%d " 599 "nodes_died_in_new=%d "
598 "nodes_copied_in_new=%d " 600 "nodes_copied_in_new=%d "
599 "nodes_promoted=%d " 601 "nodes_promoted=%d "
600 "promotion_ratio=%.1f%% " 602 "promotion_ratio=%.1f%% "
601 "average_survival_ratio=%.1f%% " 603 "average_survival_ratio=%.1f%% "
602 "promotion_rate=%.1f%% " 604 "promotion_rate=%.1f%% "
603 "semi_space_copy_rate=%.1f%% " 605 "semi_space_copy_rate=%.1f%% "
604 "new_space_allocation_throughput=%" V8_PTR_PREFIX 606 "new_space_allocation_throughput=%.1f "
605 "d "
606 "context_disposal_rate=%.1f " 607 "context_disposal_rate=%.1f "
607 "compaction_speed=%" V8_PTR_PREFIX "d\n", 608 "compaction_speed=%" V8_PTR_PREFIX "d\n",
608 heap_->isolate()->time_millis_since_init(), duration, 609 heap_->isolate()->time_millis_since_init(), duration,
609 spent_in_mutator, current_.TypeName(true), current_.reduce_memory, 610 spent_in_mutator, current_.TypeName(true), current_.reduce_memory,
610 current_.scopes[Scope::MC_CLEAR], 611 current_.scopes[Scope::MC_CLEAR],
611 current_.scopes[Scope::MC_CLEAR_CODE_FLUSH], 612 current_.scopes[Scope::MC_CLEAR_CODE_FLUSH],
612 current_.scopes[Scope::MC_CLEAR_DEPENDENT_CODE], 613 current_.scopes[Scope::MC_CLEAR_DEPENDENT_CODE],
613 current_.scopes[Scope::MC_CLEAR_GLOBAL_HANDLES], 614 current_.scopes[Scope::MC_CLEAR_GLOBAL_HANDLES],
614 current_.scopes[Scope::MC_CLEAR_MAPS], 615 current_.scopes[Scope::MC_CLEAR_MAPS],
615 current_.scopes[Scope::MC_CLEAR_SLOTS_BUFFER], 616 current_.scopes[Scope::MC_CLEAR_SLOTS_BUFFER],
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 combined_mark_compact_speed_cache_ = 805 combined_mark_compact_speed_cache_ =
805 static_cast<double>(MarkCompactSpeedInBytesPerMillisecond()); 806 static_cast<double>(MarkCompactSpeedInBytesPerMillisecond());
806 } else { 807 } else {
807 // Combine the speed of incremental step and the speed of the final step. 808 // Combine the speed of incremental step and the speed of the final step.
808 // 1 / (1 / speed1 + 1 / speed2) = speed1 * speed2 / (speed1 + speed2). 809 // 1 / (1 / speed1 + 1 / speed2) = speed1 * speed2 / (speed1 + speed2).
809 combined_mark_compact_speed_cache_ = speed1 * speed2 / (speed1 + speed2); 810 combined_mark_compact_speed_cache_ = speed1 * speed2 / (speed1 + speed2);
810 } 811 }
811 return combined_mark_compact_speed_cache_; 812 return combined_mark_compact_speed_cache_;
812 } 813 }
813 814
814 815 double GCTracer::NewSpaceAllocationThroughputInBytesPerMillisecond(
815 size_t GCTracer::NewSpaceAllocationThroughputInBytesPerMillisecond(
816 double time_ms) const { 816 double time_ms) const {
817 size_t bytes = new_space_allocation_in_bytes_since_gc_; 817 size_t bytes = new_space_allocation_in_bytes_since_gc_;
818 double durations = allocation_duration_since_gc_; 818 double durations = allocation_duration_since_gc_;
819 AllocationEventBuffer::const_iterator iter = 819 AllocationEventBuffer::const_iterator iter =
820 new_space_allocation_events_.begin(); 820 new_space_allocation_events_.begin();
821 const size_t max_bytes = static_cast<size_t>(-1); 821 const size_t max_bytes = static_cast<size_t>(-1);
822 while (iter != new_space_allocation_events_.end() && 822 while (iter != new_space_allocation_events_.end() &&
823 bytes < max_bytes - bytes && (time_ms == 0 || durations < time_ms)) { 823 bytes < max_bytes - bytes && (time_ms == 0 || durations < time_ms)) {
824 bytes += iter->allocation_in_bytes_; 824 bytes += iter->allocation_in_bytes_;
825 durations += iter->duration_; 825 durations += iter->duration_;
826 ++iter; 826 ++iter;
827 } 827 }
828 828
829 if (durations == 0.0) return 0; 829 if (durations == 0.0) return 0;
830
830 // Make sure the result is at least 1. 831 // Make sure the result is at least 1.
831 return Max<size_t>(static_cast<size_t>(bytes / durations + 0.5), 1); 832 return Max<double>(bytes / durations, 1);
832 } 833 }
833 834
834 835 double GCTracer::OldGenerationAllocationThroughputInBytesPerMillisecond(
835 size_t GCTracer::OldGenerationAllocationThroughputInBytesPerMillisecond(
836 double time_ms) const { 836 double time_ms) const {
837 size_t bytes = old_generation_allocation_in_bytes_since_gc_; 837 size_t bytes = old_generation_allocation_in_bytes_since_gc_;
838 double durations = allocation_duration_since_gc_; 838 double durations = allocation_duration_since_gc_;
839 AllocationEventBuffer::const_iterator iter = 839 AllocationEventBuffer::const_iterator iter =
840 old_generation_allocation_events_.begin(); 840 old_generation_allocation_events_.begin();
841 const size_t max_bytes = static_cast<size_t>(-1); 841 const size_t max_bytes = static_cast<size_t>(-1);
842 while (iter != old_generation_allocation_events_.end() && 842 while (iter != old_generation_allocation_events_.end() &&
843 bytes < max_bytes - bytes && (time_ms == 0 || durations < time_ms)) { 843 bytes < max_bytes - bytes && (time_ms == 0 || durations < time_ms)) {
844 bytes += iter->allocation_in_bytes_; 844 bytes += iter->allocation_in_bytes_;
845 durations += iter->duration_; 845 durations += iter->duration_;
846 ++iter; 846 ++iter;
847 } 847 }
848 848
849 if (durations == 0.0) return 0; 849 if (durations == 0.0) return 0;
850 // Make sure the result is at least 1. 850 // Make sure the result is at least 1.
851 return Max<size_t>(static_cast<size_t>(bytes / durations + 0.5), 1); 851 return Max<double>(bytes / durations, 1);
852 } 852 }
853 853
854 854 double GCTracer::AllocationThroughputInBytesPerMillisecond(
855 size_t GCTracer::AllocationThroughputInBytesPerMillisecond(
856 double time_ms) const { 855 double time_ms) const {
857 return NewSpaceAllocationThroughputInBytesPerMillisecond(time_ms) + 856 return NewSpaceAllocationThroughputInBytesPerMillisecond(time_ms) +
858 OldGenerationAllocationThroughputInBytesPerMillisecond(time_ms); 857 OldGenerationAllocationThroughputInBytesPerMillisecond(time_ms);
859 } 858 }
860 859
861 860
862 size_t GCTracer::CurrentAllocationThroughputInBytesPerMillisecond() const { 861 size_t GCTracer::CurrentAllocationThroughputInBytesPerMillisecond() const {
863 return AllocationThroughputInBytesPerMillisecond(kThroughputTimeFrameMs); 862 return AllocationThroughputInBytesPerMillisecond(kThroughputTimeFrameMs);
864 } 863 }
865 864
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 901
903 902
904 bool GCTracer::SurvivalEventsRecorded() const { 903 bool GCTracer::SurvivalEventsRecorded() const {
905 return survival_events_.size() > 0; 904 return survival_events_.size() > 0;
906 } 905 }
907 906
908 907
909 void GCTracer::ResetSurvivalEvents() { survival_events_.reset(); } 908 void GCTracer::ResetSurvivalEvents() { survival_events_.reset(); }
910 } // namespace internal 909 } // namespace internal
911 } // namespace v8 910 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/gc-tracer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698