From eeca7c7759c81de0f21f1af5b2516b81b7c806a6 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Fri, 7 Dec 2012 09:44:10 +0000 Subject: [PATCH] Add GCTracer metrics for a scavenger GC for DOM wrappers This patch adds the following three metrics for the --trace_gc_nvp option. nodes_died_in_new_space_; // Number of died nodes in the new space. nodes_copied_in_new_space_; // Number of copied nodes to the new space. nodes_promoted; // Number of promoted nodes to the old space. BUG= TEST=Manually confirmed that the "--trace_gc --trace_gc_nvp" option prints the metrics Review URL: https://codereview.chromium.org/11365146 Patch from Kentaro Hara . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13159 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/global-handles.cc | 13 ++++++++++--- src/global-handles.h | 3 ++- src/heap.cc | 9 ++++++++- src/heap.h | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/global-handles.cc b/src/global-handles.cc index 085f1d4..392a181 100644 --- a/src/global-handles.cc +++ b/src/global-handles.cc @@ -597,7 +597,7 @@ bool GlobalHandles::IterateObjectGroups(ObjectVisitor* v, bool GlobalHandles::PostGarbageCollectionProcessing( - GarbageCollector collector) { + GarbageCollector collector, GCTracer* tracer) { // Process weak global handle callbacks. This must be done after the // GC is completely done, because the callbacks may invoke arbitrary // API functions. @@ -647,10 +647,17 @@ bool GlobalHandles::PostGarbageCollectionProcessing( for (int i = 0; i < new_space_nodes_.length(); ++i) { Node* node = new_space_nodes_[i]; ASSERT(node->is_in_new_space_list()); - if (node->IsRetainer() && isolate_->heap()->InNewSpace(node->object())) { - new_space_nodes_[last++] = node; + if (node->IsRetainer()) { + if (isolate_->heap()->InNewSpace(node->object())) { + new_space_nodes_[last++] = node; + tracer->increment_nodes_copied_in_new_space(); + } else { + node->set_in_new_space_list(false); + tracer->increment_nodes_promoted(); + } } else { node->set_in_new_space_list(false); + tracer->increment_nodes_died_in_new_space(); } } new_space_nodes_.Rewind(last); diff --git a/src/global-handles.h b/src/global-handles.h index 904c5b5..7808d16 100644 --- a/src/global-handles.h +++ b/src/global-handles.h @@ -168,7 +168,8 @@ class GlobalHandles { // Process pending weak handles. // Returns true if next major GC is likely to collect more garbage. - bool PostGarbageCollectionProcessing(GarbageCollector collector); + bool PostGarbageCollectionProcessing(GarbageCollector collector, + GCTracer* tracer); // Iterates over all strong handles. void IterateStrongRoots(ObjectVisitor* v); diff --git a/src/heap.cc b/src/heap.cc index dac28f3..746c9b6 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -965,7 +965,8 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector, { DisableAssertNoAllocation allow_allocation; GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL); next_gc_likely_to_collect_more = - isolate_->global_handles()->PostGarbageCollectionProcessing(collector); + isolate_->global_handles()->PostGarbageCollectionProcessing( + collector, tracer); } gc_post_processing_depth_--; @@ -6864,6 +6865,9 @@ GCTracer::GCTracer(Heap* heap, allocated_since_last_gc_(0), spent_in_mutator_(0), promoted_objects_size_(0), + nodes_died_in_new_space_(0), + nodes_copied_in_new_space_(0), + nodes_promoted_(0), heap_(heap), gc_reason_(gc_reason), collector_reason_(collector_reason) { @@ -7004,6 +7008,9 @@ GCTracer::~GCTracer() { PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc_); PrintF("promoted=%" V8_PTR_PREFIX "d ", promoted_objects_size_); + PrintF("nodes_died_in_new=%d ", nodes_died_in_new_space_); + PrintF("nodes_copied_in_new=%d ", nodes_copied_in_new_space_); + PrintF("nodes_promoted=%d ", nodes_promoted_); if (collector_ == SCAVENGER) { PrintF("stepscount=%d ", steps_count_since_last_gc_); diff --git a/src/heap.h b/src/heap.h index 606f787..06d479f 100644 --- a/src/heap.h +++ b/src/heap.h @@ -2549,6 +2549,18 @@ class GCTracer BASE_EMBEDDED { promoted_objects_size_ += object_size; } + void increment_nodes_died_in_new_space() { + nodes_died_in_new_space_++; + } + + void increment_nodes_copied_in_new_space() { + nodes_copied_in_new_space_++; + } + + void increment_nodes_promoted() { + nodes_promoted_++; + } + private: // Returns a string matching the collector. const char* CollectorString(); @@ -2593,6 +2605,15 @@ class GCTracer BASE_EMBEDDED { // Size of objects promoted during the current collection. intptr_t promoted_objects_size_; + // Number of died nodes in the new space. + int nodes_died_in_new_space_; + + // Number of copied nodes to the new space. + int nodes_copied_in_new_space_; + + // Number of promoted nodes to the old space. + int nodes_promoted_; + // Incremental marking steps counters. int steps_count_; double steps_took_; -- 2.7.4