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

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

Issue 2293883002: Make incremental marking tracing format consistent with GC tracing. (Closed)
Patch Set: Move marking restart function to inl file Created 4 years, 3 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') | src/heap/heap.cc » ('j') | 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 i <= Scope::LAST_INCREMENTAL_SCOPE; i++) { 221 i <= Scope::LAST_INCREMENTAL_SCOPE; i++) {
222 current_.scopes[i] = 222 current_.scopes[i] =
223 current_.incremental_marking_scopes[i].cumulative_duration - 223 current_.incremental_marking_scopes[i].cumulative_duration -
224 baseline.incremental_marking_scopes[i].cumulative_duration; 224 baseline.incremental_marking_scopes[i].cumulative_duration;
225 } 225 }
226 } 226 }
227 227
228 void GCTracer::Stop(GarbageCollector collector) { 228 void GCTracer::Stop(GarbageCollector collector) {
229 start_counter_--; 229 start_counter_--;
230 if (start_counter_ != 0) { 230 if (start_counter_ != 0) {
231 PrintIsolate(heap_->isolate(), "[Finished reentrant %s during %s.]\n", 231 heap_->isolate()->PrintWithTimestamp(
232 collector == SCAVENGER ? "Scavenge" : "Mark-sweep", 232 "[Finished reentrant %s during %s.]\n",
233 current_.TypeName(false)); 233 collector == SCAVENGER ? "Scavenge" : "Mark-sweep",
234 current_.TypeName(false));
234 return; 235 return;
235 } 236 }
236 237
237 DCHECK(start_counter_ >= 0); 238 DCHECK(start_counter_ >= 0);
238 DCHECK((collector == SCAVENGER && current_.type == Event::SCAVENGER) || 239 DCHECK((collector == SCAVENGER && current_.type == Event::SCAVENGER) ||
239 (collector == MARK_COMPACTOR && 240 (collector == MARK_COMPACTOR &&
240 (current_.type == Event::MARK_COMPACTOR || 241 (current_.type == Event::MARK_COMPACTOR ||
241 current_.type == Event::INCREMENTAL_MARK_COMPACTOR))); 242 current_.type == Event::INCREMENTAL_MARK_COMPACTOR)));
242 243
243 for (int i = Scope::FIRST_INCREMENTAL_SCOPE; 244 for (int i = Scope::FIRST_INCREMENTAL_SCOPE;
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 402
402 heap_->AddToRingBuffer(buffer.start()); 403 heap_->AddToRingBuffer(buffer.start());
403 } 404 }
404 405
405 406
406 void GCTracer::Print() const { 407 void GCTracer::Print() const {
407 double duration = current_.end_time - current_.start_time; 408 double duration = current_.end_time - current_.start_time;
408 const size_t kIncrementalStatsSize = 128; 409 const size_t kIncrementalStatsSize = 128;
409 char incremental_buffer[kIncrementalStatsSize] = {0}; 410 char incremental_buffer[kIncrementalStatsSize] = {0};
410 411
411 if (current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps > 0) { 412 if (current_.type == Event::INCREMENTAL_MARK_COMPACTOR) {
412 if (current_.type == Event::SCAVENGER) { 413 base::OS::SNPrintF(
413 base::OS::SNPrintF( 414 incremental_buffer, kIncrementalStatsSize,
414 incremental_buffer, kIncrementalStatsSize, 415 " (+ %.1f ms in %d steps since start of marking, "
415 " (+ %.1f ms in %d steps since last GC)", 416 "biggest step %.1f ms, walltime since start of marking %.f ms)",
416 current_.scopes[Scope::MC_INCREMENTAL], 417 current_.scopes[Scope::MC_INCREMENTAL],
417 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps); 418 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps,
418 } else { 419 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].longest_step,
419 base::OS::SNPrintF( 420 current_.end_time - incremental_marking_start_time_);
420 incremental_buffer, kIncrementalStatsSize,
421 " (+ %.1f ms in %d steps since start of marking, "
422 "biggest step %.1f ms)",
423 current_.scopes[Scope::MC_INCREMENTAL],
424 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps,
425 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL]
426 .longest_step);
427 }
428 } 421 }
429 422
430 // Avoid PrintF as Output also appends the string to the tracing ring buffer 423 // Avoid PrintF as Output also appends the string to the tracing ring buffer
431 // that gets printed on OOM failures. 424 // that gets printed on OOM failures.
432 Output( 425 Output(
433 "[%d:%p] " 426 "[%d:%p] "
434 "%8.0f ms: " 427 "%8.0f ms: "
435 "%s %.1f (%.1f) -> %.1f (%.1f) MB, " 428 "%s %.1f (%.1f) -> %.1f (%.1f) MB, "
436 "%.1f / %.1f ms %s %s %s\n", 429 "%.1f / %.1f ms %s %s %s\n",
437 base::OS::GetCurrentProcessId(), 430 base::OS::GetCurrentProcessId(),
438 reinterpret_cast<void*>(heap_->isolate()), 431 reinterpret_cast<void*>(heap_->isolate()),
439 heap_->isolate()->time_millis_since_init(), current_.TypeName(false), 432 heap_->isolate()->time_millis_since_init(), current_.TypeName(false),
440 static_cast<double>(current_.start_object_size) / MB, 433 static_cast<double>(current_.start_object_size) / MB,
441 static_cast<double>(current_.start_memory_size) / MB, 434 static_cast<double>(current_.start_memory_size) / MB,
442 static_cast<double>(current_.end_object_size) / MB, 435 static_cast<double>(current_.end_object_size) / MB,
443 static_cast<double>(current_.end_memory_size) / MB, duration, 436 static_cast<double>(current_.end_memory_size) / MB, duration,
444 TotalExternalTime(), incremental_buffer, 437 TotalExternalTime(), incremental_buffer,
445 current_.gc_reason != nullptr ? current_.gc_reason : "", 438 current_.gc_reason != nullptr ? current_.gc_reason : "",
446 current_.collector_reason != nullptr ? current_.collector_reason : ""); 439 current_.collector_reason != nullptr ? current_.collector_reason : "");
447 } 440 }
448 441
449 442
450 void GCTracer::PrintNVP() const { 443 void GCTracer::PrintNVP() const {
451 double duration = current_.end_time - current_.start_time; 444 double duration = current_.end_time - current_.start_time;
452 double spent_in_mutator = current_.start_time - previous_.end_time; 445 double spent_in_mutator = current_.start_time - previous_.end_time;
453 intptr_t allocated_since_last_gc = 446 intptr_t allocated_since_last_gc =
454 current_.start_object_size - previous_.end_object_size; 447 current_.start_object_size - previous_.end_object_size;
455 448
449 double incremental_walltime_duration = 0;
450
451 if (current_.type == Event::INCREMENTAL_MARK_COMPACTOR) {
452 incremental_walltime_duration =
453 current_.end_time - incremental_marking_start_time_;
454 }
455
456 switch (current_.type) { 456 switch (current_.type) {
457 case Event::SCAVENGER: 457 case Event::SCAVENGER:
458 PrintIsolate( 458 heap_->isolate()->PrintWithTimestamp(
459 heap_->isolate(),
460 "%8.0f ms: "
461 "pause=%.1f " 459 "pause=%.1f "
462 "mutator=%.1f " 460 "mutator=%.1f "
463 "gc=%s " 461 "gc=%s "
464 "reduce_memory=%d " 462 "reduce_memory=%d "
465 "scavenge=%.2f " 463 "scavenge=%.2f "
466 "old_new=%.2f " 464 "old_new=%.2f "
467 "weak=%.2f " 465 "weak=%.2f "
468 "roots=%.2f " 466 "roots=%.2f "
469 "code=%.2f " 467 "code=%.2f "
470 "semispace=%.2f " 468 "semispace=%.2f "
(...skipping 20 matching lines...) Expand all
491 " " 489 " "
492 "nodes_died_in_new=%d " 490 "nodes_died_in_new=%d "
493 "nodes_copied_in_new=%d " 491 "nodes_copied_in_new=%d "
494 "nodes_promoted=%d " 492 "nodes_promoted=%d "
495 "promotion_ratio=%.1f%% " 493 "promotion_ratio=%.1f%% "
496 "average_survival_ratio=%.1f%% " 494 "average_survival_ratio=%.1f%% "
497 "promotion_rate=%.1f%% " 495 "promotion_rate=%.1f%% "
498 "semi_space_copy_rate=%.1f%% " 496 "semi_space_copy_rate=%.1f%% "
499 "new_space_allocation_throughput=%.1f " 497 "new_space_allocation_throughput=%.1f "
500 "context_disposal_rate=%.1f\n", 498 "context_disposal_rate=%.1f\n",
501 heap_->isolate()->time_millis_since_init(), duration, 499 duration, spent_in_mutator, current_.TypeName(true),
502 spent_in_mutator, current_.TypeName(true), current_.reduce_memory, 500 current_.reduce_memory, current_.scopes[Scope::SCAVENGER_SCAVENGE],
503 current_.scopes[Scope::SCAVENGER_SCAVENGE],
504 current_.scopes[Scope::SCAVENGER_OLD_TO_NEW_POINTERS], 501 current_.scopes[Scope::SCAVENGER_OLD_TO_NEW_POINTERS],
505 current_.scopes[Scope::SCAVENGER_WEAK], 502 current_.scopes[Scope::SCAVENGER_WEAK],
506 current_.scopes[Scope::SCAVENGER_ROOTS], 503 current_.scopes[Scope::SCAVENGER_ROOTS],
507 current_.scopes[Scope::SCAVENGER_CODE_FLUSH_CANDIDATES], 504 current_.scopes[Scope::SCAVENGER_CODE_FLUSH_CANDIDATES],
508 current_.scopes[Scope::SCAVENGER_SEMISPACE], 505 current_.scopes[Scope::SCAVENGER_SEMISPACE],
509 current_.scopes[Scope::SCAVENGER_OBJECT_GROUPS], 506 current_.scopes[Scope::SCAVENGER_OBJECT_GROUPS],
510 current_.scopes[Scope::SCAVENGER_EXTERNAL_PROLOGUE], 507 current_.scopes[Scope::SCAVENGER_EXTERNAL_PROLOGUE],
511 current_.scopes[Scope::SCAVENGER_EXTERNAL_EPILOGUE], 508 current_.scopes[Scope::SCAVENGER_EXTERNAL_EPILOGUE],
512 current_.scopes[Scope::EXTERNAL_WEAK_GLOBAL_HANDLES], 509 current_.scopes[Scope::EXTERNAL_WEAK_GLOBAL_HANDLES],
513 current_.incremental_marking_scopes[GCTracer::Scope::MC_INCREMENTAL] 510 current_.incremental_marking_scopes[GCTracer::Scope::MC_INCREMENTAL]
514 .steps, 511 .steps,
515 current_.scopes[Scope::MC_INCREMENTAL], 512 current_.scopes[Scope::MC_INCREMENTAL],
516 ScavengeSpeedInBytesPerMillisecond(), current_.start_object_size, 513 ScavengeSpeedInBytesPerMillisecond(), current_.start_object_size,
517 current_.end_object_size, current_.start_holes_size, 514 current_.end_object_size, current_.start_holes_size,
518 current_.end_holes_size, allocated_since_last_gc, 515 current_.end_holes_size, allocated_since_last_gc,
519 heap_->promoted_objects_size(), 516 heap_->promoted_objects_size(),
520 heap_->semi_space_copied_object_size(), 517 heap_->semi_space_copied_object_size(),
521 heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_, 518 heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_,
522 heap_->nodes_promoted_, heap_->promotion_ratio_, 519 heap_->nodes_promoted_, heap_->promotion_ratio_,
523 AverageSurvivalRatio(), heap_->promotion_rate_, 520 AverageSurvivalRatio(), heap_->promotion_rate_,
524 heap_->semi_space_copied_rate_, 521 heap_->semi_space_copied_rate_,
525 NewSpaceAllocationThroughputInBytesPerMillisecond(), 522 NewSpaceAllocationThroughputInBytesPerMillisecond(),
526 ContextDisposalRateInMilliseconds()); 523 ContextDisposalRateInMilliseconds());
527 break; 524 break;
528 case Event::MARK_COMPACTOR: 525 case Event::MARK_COMPACTOR:
529 case Event::INCREMENTAL_MARK_COMPACTOR: 526 case Event::INCREMENTAL_MARK_COMPACTOR:
530 PrintIsolate( 527 heap_->isolate()->PrintWithTimestamp(
531 heap_->isolate(),
532 "%8.0f ms: "
533 "pause=%.1f " 528 "pause=%.1f "
534 "mutator=%.1f " 529 "mutator=%.1f "
535 "gc=%s " 530 "gc=%s "
536 "reduce_memory=%d " 531 "reduce_memory=%d "
537 "clear=%1.f " 532 "clear=%1.f "
538 "clear.code_flush=%.1f " 533 "clear.code_flush=%.1f "
539 "clear.dependent_code=%.1f " 534 "clear.dependent_code=%.1f "
540 "clear.global_handles=%.1f " 535 "clear.global_handles=%.1f "
541 "clear.maps=%.1f " 536 "clear.maps=%.1f "
542 "clear.slots_buffer=%.1f " 537 "clear.slots_buffer=%.1f "
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 "incremental.finalize.external.epilogue=%.1f " 576 "incremental.finalize.external.epilogue=%.1f "
582 "incremental.finalize.object_grouping=%.1f " 577 "incremental.finalize.object_grouping=%.1f "
583 "incremental.wrapper_prologue=%.1f " 578 "incremental.wrapper_prologue=%.1f "
584 "incremental.wrapper_tracing=%.1f " 579 "incremental.wrapper_tracing=%.1f "
585 "incremental_wrapper_tracing_longest_step=%.1f " 580 "incremental_wrapper_tracing_longest_step=%.1f "
586 "incremental_finalize_longest_step=%.1f " 581 "incremental_finalize_longest_step=%.1f "
587 "incremental_finalize_steps_count=%d " 582 "incremental_finalize_steps_count=%d "
588 "incremental_longest_step=%.1f " 583 "incremental_longest_step=%.1f "
589 "incremental_steps_count=%d " 584 "incremental_steps_count=%d "
590 "incremental_marking_throughput=%.f " 585 "incremental_marking_throughput=%.f "
586 "incremental_walltime_duration=%.f "
591 "total_size_before=%" V8PRIdPTR 587 "total_size_before=%" V8PRIdPTR
592 " " 588 " "
593 "total_size_after=%" V8PRIdPTR 589 "total_size_after=%" V8PRIdPTR
594 " " 590 " "
595 "holes_size_before=%" V8PRIdPTR 591 "holes_size_before=%" V8PRIdPTR
596 " " 592 " "
597 "holes_size_after=%" V8PRIdPTR 593 "holes_size_after=%" V8PRIdPTR
598 " " 594 " "
599 "allocated=%" V8PRIdPTR 595 "allocated=%" V8PRIdPTR
600 " " 596 " "
601 "promoted=%" V8PRIdPTR 597 "promoted=%" V8PRIdPTR
602 " " 598 " "
603 "semi_space_copied=%" V8PRIdPTR 599 "semi_space_copied=%" V8PRIdPTR
604 " " 600 " "
605 "nodes_died_in_new=%d " 601 "nodes_died_in_new=%d "
606 "nodes_copied_in_new=%d " 602 "nodes_copied_in_new=%d "
607 "nodes_promoted=%d " 603 "nodes_promoted=%d "
608 "promotion_ratio=%.1f%% " 604 "promotion_ratio=%.1f%% "
609 "average_survival_ratio=%.1f%% " 605 "average_survival_ratio=%.1f%% "
610 "promotion_rate=%.1f%% " 606 "promotion_rate=%.1f%% "
611 "semi_space_copy_rate=%.1f%% " 607 "semi_space_copy_rate=%.1f%% "
612 "new_space_allocation_throughput=%.1f " 608 "new_space_allocation_throughput=%.1f "
613 "context_disposal_rate=%.1f " 609 "context_disposal_rate=%.1f "
614 "compaction_speed=%.f\n", 610 "compaction_speed=%.f\n",
615 heap_->isolate()->time_millis_since_init(), duration, 611 duration, spent_in_mutator, current_.TypeName(true),
616 spent_in_mutator, current_.TypeName(true), current_.reduce_memory, 612 current_.reduce_memory, current_.scopes[Scope::MC_CLEAR],
617 current_.scopes[Scope::MC_CLEAR],
618 current_.scopes[Scope::MC_CLEAR_CODE_FLUSH], 613 current_.scopes[Scope::MC_CLEAR_CODE_FLUSH],
619 current_.scopes[Scope::MC_CLEAR_DEPENDENT_CODE], 614 current_.scopes[Scope::MC_CLEAR_DEPENDENT_CODE],
620 current_.scopes[Scope::MC_CLEAR_GLOBAL_HANDLES], 615 current_.scopes[Scope::MC_CLEAR_GLOBAL_HANDLES],
621 current_.scopes[Scope::MC_CLEAR_MAPS], 616 current_.scopes[Scope::MC_CLEAR_MAPS],
622 current_.scopes[Scope::MC_CLEAR_SLOTS_BUFFER], 617 current_.scopes[Scope::MC_CLEAR_SLOTS_BUFFER],
623 current_.scopes[Scope::MC_CLEAR_STORE_BUFFER], 618 current_.scopes[Scope::MC_CLEAR_STORE_BUFFER],
624 current_.scopes[Scope::MC_CLEAR_STRING_TABLE], 619 current_.scopes[Scope::MC_CLEAR_STRING_TABLE],
625 current_.scopes[Scope::MC_CLEAR_WEAK_CELLS], 620 current_.scopes[Scope::MC_CLEAR_WEAK_CELLS],
626 current_.scopes[Scope::MC_CLEAR_WEAK_COLLECTIONS], 621 current_.scopes[Scope::MC_CLEAR_WEAK_COLLECTIONS],
627 current_.scopes[Scope::MC_CLEAR_WEAK_LISTS], 622 current_.scopes[Scope::MC_CLEAR_WEAK_LISTS],
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 current_ 662 current_
668 .incremental_marking_scopes[Scope::MC_INCREMENTAL_FINALIZE_BODY] 663 .incremental_marking_scopes[Scope::MC_INCREMENTAL_FINALIZE_BODY]
669 .longest_step, 664 .longest_step,
670 current_ 665 current_
671 .incremental_marking_scopes[Scope::MC_INCREMENTAL_FINALIZE_BODY] 666 .incremental_marking_scopes[Scope::MC_INCREMENTAL_FINALIZE_BODY]
672 .steps, 667 .steps,
673 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL] 668 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL]
674 .longest_step, 669 .longest_step,
675 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps, 670 current_.incremental_marking_scopes[Scope::MC_INCREMENTAL].steps,
676 IncrementalMarkingSpeedInBytesPerMillisecond(), 671 IncrementalMarkingSpeedInBytesPerMillisecond(),
677 current_.start_object_size, current_.end_object_size, 672 incremental_walltime_duration, current_.start_object_size,
678 current_.start_holes_size, current_.end_holes_size, 673 current_.end_object_size, current_.start_holes_size,
679 allocated_since_last_gc, heap_->promoted_objects_size(), 674 current_.end_holes_size, allocated_since_last_gc,
675 heap_->promoted_objects_size(),
680 heap_->semi_space_copied_object_size(), 676 heap_->semi_space_copied_object_size(),
681 heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_, 677 heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_,
682 heap_->nodes_promoted_, heap_->promotion_ratio_, 678 heap_->nodes_promoted_, heap_->promotion_ratio_,
683 AverageSurvivalRatio(), heap_->promotion_rate_, 679 AverageSurvivalRatio(), heap_->promotion_rate_,
684 heap_->semi_space_copied_rate_, 680 heap_->semi_space_copied_rate_,
685 NewSpaceAllocationThroughputInBytesPerMillisecond(), 681 NewSpaceAllocationThroughputInBytesPerMillisecond(),
686 ContextDisposalRateInMilliseconds(), 682 ContextDisposalRateInMilliseconds(),
687 CompactionSpeedInBytesPerMillisecond()); 683 CompactionSpeedInBytesPerMillisecond());
688 break; 684 break;
689 case Event::START: 685 case Event::START:
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 double sum = recorded_survival_ratios_.Sum( 810 double sum = recorded_survival_ratios_.Sum(
815 [](double a, double b) { return a + b; }, 0.0); 811 [](double a, double b) { return a + b; }, 0.0);
816 return sum / recorded_survival_ratios_.Count(); 812 return sum / recorded_survival_ratios_.Count();
817 } 813 }
818 814
819 bool GCTracer::SurvivalEventsRecorded() const { 815 bool GCTracer::SurvivalEventsRecorded() const {
820 return recorded_survival_ratios_.Count() > 0; 816 return recorded_survival_ratios_.Count() > 0;
821 } 817 }
822 818
823 void GCTracer::ResetSurvivalEvents() { recorded_survival_ratios_.Reset(); } 819 void GCTracer::ResetSurvivalEvents() { recorded_survival_ratios_.Reset(); }
820
821 void GCTracer::NotifyIncrementalMarkingStart() {
822 incremental_marking_start_time_ = heap_->MonotonicallyIncreasingTimeInMs();
823 }
824
824 } // namespace internal 825 } // namespace internal
825 } // namespace v8 826 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/gc-tracer.h ('k') | src/heap/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698