Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 5d338b2122374a163e083aca1453c7c135bc4c0b..b4f5667b996360c09a1a62f11a6ee63f298b0360 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -97,10 +97,13 @@ Heap::Heap() |
gc_safe_size_of_old_object_(NULL), |
total_regexp_code_generated_(0), |
tracer_(NULL), |
- young_survivors_after_last_gc_(0), |
high_survival_rate_period_length_(0), |
low_survival_rate_period_length_(0), |
survival_rate_(0), |
+ promoted_objects_size_(0), |
+ promotion_rate_(0), |
+ semi_space_copied_object_size_(0), |
+ semi_space_copied_rate_(0), |
previous_survival_rate_trend_(Heap::STABLE), |
survival_rate_trend_(Heap::STABLE), |
max_gc_pause_(0.0), |
@@ -421,6 +424,10 @@ void Heap::GarbageCollectionPrologue() { |
#endif |
} |
+ // Reset GC statistics. |
+ promoted_objects_size_ = 0; |
+ semi_space_copied_object_size_ = 0; |
+ |
UpdateMaximumCommitted(); |
#ifdef DEBUG |
@@ -1005,9 +1012,15 @@ void Heap::ClearNormalizedMapCaches() { |
void Heap::UpdateSurvivalRateTrend(int start_new_space_size) { |
if (start_new_space_size == 0) return; |
- double survival_rate = |
- (static_cast<double>(young_survivors_after_last_gc_) * 100) / |
- start_new_space_size; |
+ promotion_rate_ = |
+ (static_cast<double>(promoted_objects_size_) / |
+ static_cast<double>(start_new_space_size) * 100); |
+ |
+ semi_space_copied_rate_ = |
+ (static_cast<double>(semi_space_copied_object_size_) / |
+ static_cast<double>(start_new_space_size) * 100); |
+ |
+ double survival_rate = promotion_rate_ + semi_space_copied_rate_; |
if (survival_rate > kYoungSurvivalRateHighThreshold) { |
high_survival_rate_period_length_++; |
@@ -2056,7 +2069,7 @@ class ScavengingVisitor : public StaticVisitorBase { |
} |
} |
- heap->tracer()->increment_promoted_objects_size(object_size); |
+ heap->IncrementPromotedObjectsSize(object_size); |
return; |
} |
} |
@@ -2075,6 +2088,7 @@ class ScavengingVisitor : public StaticVisitorBase { |
// buffer. |
*slot = target; |
MigrateObject(heap, object, target, object_size); |
+ heap->IncrementSemiSpaceCopiedObjectSize(object_size); |
return; |
} |
@@ -6028,7 +6042,6 @@ GCTracer::GCTracer(Heap* heap, |
full_gc_count_(0), |
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), |
@@ -6175,11 +6188,15 @@ GCTracer::~GCTracer() { |
PrintF("holes_size_after=%" V8_PTR_PREFIX "d ", CountTotalHolesSize(heap_)); |
PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc_); |
- PrintF("promoted=%" V8_PTR_PREFIX "d ", promoted_objects_size_); |
+ PrintF("promoted=%" V8_PTR_PREFIX "d ", heap_->promoted_objects_size_); |
+ PrintF("semi_space_copied=%" V8_PTR_PREFIX "d ", |
+ heap_->semi_space_copied_object_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_); |
- PrintF("survived=%.1f%% ", heap_->survival_rate_); |
+ PrintF("survival_rate=%.1f%% ", heap_->survival_rate_); |
+ PrintF("promotion_rate=%.1f%% ", heap_->promotion_rate_); |
+ PrintF("semi_space_copy_rate=%.1f%% ", heap_->semi_space_copied_rate_); |
if (collector_ == SCAVENGER) { |
PrintF("stepscount=%d ", steps_count_since_last_gc_); |