From 34218e554067fb28269156b3ffecb7580f33fbda Mon Sep 17 00:00:00 2001 From: "iposva@chromium.org" Date: Mon, 25 May 2009 16:33:00 +0000 Subject: [PATCH] - Introduce histograms collecting data about the number of set remembered set bits in a page. Review URL: http://codereview.chromium.org/113819 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2045 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap.cc | 24 ++++++++++++++++++------ src/heap.h | 9 +++++---- src/spaces.cc | 22 ++++++++++++++++------ 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/heap.cc b/src/heap.cc index 998ae94..772cf32 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -2664,12 +2664,13 @@ void Heap::ZapFromSpace() { #endif // DEBUG -void Heap::IterateRSetRange(Address object_start, - Address object_end, - Address rset_start, - ObjectSlotCallback copy_object_func) { +int Heap::IterateRSetRange(Address object_start, + Address object_end, + Address rset_start, + ObjectSlotCallback copy_object_func) { Address object_address = object_start; Address rset_address = rset_start; + int set_bits_count = 0; // Loop over all the pointers in [object_start, object_end). while (object_address < object_end) { @@ -2686,6 +2687,7 @@ void Heap::IterateRSetRange(Address object_start, // If this pointer does not need to be remembered anymore, clear // the remembered set bit. if (!Heap::InNewSpace(*object_p)) result_rset &= ~bitmask; + set_bits_count++; } object_address += kPointerSize; } @@ -2699,6 +2701,7 @@ void Heap::IterateRSetRange(Address object_start, } rset_address += kIntSize; } + return set_bits_count; } @@ -2706,11 +2709,20 @@ void Heap::IterateRSet(PagedSpace* space, ObjectSlotCallback copy_object_func) { ASSERT(Page::is_rset_in_use()); ASSERT(space == old_pointer_space_ || space == map_space_); + static void* paged_rset_histogram = StatsTable::CreateHistogram( + "V8.RSetPaged", + 0, + Page::kObjectAreaSize / kPointerSize, + 30); + PageIterator it(space, PageIterator::PAGES_IN_USE); while (it.has_next()) { Page* page = it.next(); - IterateRSetRange(page->ObjectAreaStart(), page->AllocationTop(), - page->RSetStart(), copy_object_func); + int count = IterateRSetRange(page->ObjectAreaStart(), page->AllocationTop(), + page->RSetStart(), copy_object_func); + if (paged_rset_histogram != NULL) { + StatsTable::AddHistogramSample(paged_rset_histogram, count); + } } } diff --git a/src/heap.h b/src/heap.h index 24bc991..d8080b6 100644 --- a/src/heap.h +++ b/src/heap.h @@ -667,10 +667,11 @@ class Heap : public AllStatic { // Iterates a range of remembered set addresses starting with rset_start // corresponding to the range of allocated pointers // [object_start, object_end). - static void IterateRSetRange(Address object_start, - Address object_end, - Address rset_start, - ObjectSlotCallback copy_object_func); + // Returns the number of bits that were set. + static int IterateRSetRange(Address object_start, + Address object_end, + Address rset_start, + ObjectSlotCallback copy_object_func); // Returns whether the object resides in new space. static inline bool InNewSpace(Object* object); diff --git a/src/spaces.cc b/src/spaces.cc index 7aec5bd..e61c6ad 100644 --- a/src/spaces.cc +++ b/src/spaces.cc @@ -2423,6 +2423,13 @@ void LargeObjectSpace::ClearRSet() { void LargeObjectSpace::IterateRSet(ObjectSlotCallback copy_object_func) { ASSERT(Page::is_rset_in_use()); + static void* lo_rset_histogram = StatsTable::CreateHistogram( + "V8.RSetLO", + 0, + // Keeping this histogram's buckets the same as the paged space histogram. + Page::kObjectAreaSize / kPointerSize, + 30); + LargeObjectIterator it(this); while (it.has_next()) { // We only have code, sequential strings, or fixed arrays in large @@ -2433,15 +2440,18 @@ void LargeObjectSpace::IterateRSet(ObjectSlotCallback copy_object_func) { // Iterate the normal page remembered set range. Page* page = Page::FromAddress(object->address()); Address object_end = object->address() + object->Size(); - Heap::IterateRSetRange(page->ObjectAreaStart(), - Min(page->ObjectAreaEnd(), object_end), - page->RSetStart(), - copy_object_func); + int count = Heap::IterateRSetRange(page->ObjectAreaStart(), + Min(page->ObjectAreaEnd(), object_end), + page->RSetStart(), + copy_object_func); // Iterate the extra array elements. if (object_end > page->ObjectAreaEnd()) { - Heap::IterateRSetRange(page->ObjectAreaEnd(), object_end, - object_end, copy_object_func); + count += Heap::IterateRSetRange(page->ObjectAreaEnd(), object_end, + object_end, copy_object_func); + } + if (lo_rset_histogram != NULL) { + StatsTable::AddHistogramSample(lo_rset_histogram, count); } } } -- 2.7.4