Index: runtime/vm/pages.cc |
=================================================================== |
--- runtime/vm/pages.cc (revision 16586) |
+++ runtime/vm/pages.cc (working copy) |
@@ -118,7 +118,6 @@ |
max_capacity_(max_capacity), |
capacity_(0), |
in_use_(0), |
- count_(0), |
sweeping_(false), |
page_space_controller_(FLAG_heap_growth_space_ratio, |
FLAG_heap_growth_rate, |
@@ -402,7 +401,7 @@ |
} |
-void PageSpace::MarkSweep(bool invoke_api_callbacks, const char* gc_reason) { |
+void PageSpace::MarkSweep(bool invoke_api_callbacks) { |
// MarkSweep is not reentrant. Make sure that is the case. |
ASSERT(!sweeping_); |
sweeping_ = true; |
@@ -426,21 +425,21 @@ |
OS::PrintErr(" done.\n"); |
} |
- if (FLAG_verbose_gc) { |
- OS::PrintErr("Start mark sweep for %s collection\n", gc_reason); |
- } |
- Timer timer(true, "MarkSweep"); |
- timer.Start(); |
- int64_t start = OS::GetCurrentTimeMillis(); |
+ int64_t start = OS::GetCurrentTimeMicros(); |
// Mark all reachable old-gen objects. |
GCMarker marker(heap_); |
marker.MarkObjects(isolate, this, invoke_api_callbacks); |
+ int64_t mid1 = OS::GetCurrentTimeMicros(); |
+ |
// Reset the bump allocation page to unused. |
// Reset the freelists and setup sweeping. |
freelist_[HeapPage::kData].Reset(); |
freelist_[HeapPage::kExecutable].Reset(); |
+ |
+ int64_t mid2 = OS::GetCurrentTimeMicros(); |
+ |
GCSweeper sweeper(heap_); |
intptr_t in_use = 0; |
@@ -459,6 +458,8 @@ |
page = next_page; |
} |
+ int64_t mid3 = OS::GetCurrentTimeMicros(); |
+ |
prev_page = NULL; |
page = large_pages_; |
while (page != NULL) { |
@@ -478,22 +479,16 @@ |
intptr_t in_use_before = in_use_; |
in_use_ = in_use; |
- int64_t end = OS::GetCurrentTimeMillis(); |
- timer.Stop(); |
+ int64_t end = OS::GetCurrentTimeMicros(); |
// Record signals for growth control. |
page_space_controller_.EvaluateGarbageCollection(in_use_before, in_use, |
start, end); |
- if (FLAG_verbose_gc) { |
- const intptr_t KB2 = KB / 2; |
- OS::PrintErr("Mark-Sweep[%d]: %"Pd64"us (%"Pd"K -> %"Pd"K, %"Pd"K)\n", |
- count_, |
- timer.TotalElapsedTime(), |
- (in_use_before + (KB2)) / KB, |
- (in_use + (KB2)) / KB, |
- (capacity_ + KB2) / KB); |
- } |
+ heap_->RecordTime(0, mid1 - start); |
+ heap_->RecordTime(1, mid2 - mid1); |
+ heap_->RecordTime(2, mid3 - mid2); |
+ heap_->RecordTime(3, end - mid3); |
if (FLAG_print_free_list_after_gc) { |
OS::Print("Data Freelist (after GC):\n"); |
@@ -512,7 +507,6 @@ |
isolate->heap()->trace()->TraceMarkSweepFinish(); |
} |
- count_++; |
// Done, reset the marker. |
ASSERT(sweeping_); |
sweeping_ = false; |
@@ -566,33 +560,22 @@ |
history_.GarbageCollectionTimeFraction(); |
bool enough_free_time = |
(garbage_collection_time_fraction <= garbage_collection_time_ratio_); |
+ |
+ Heap* heap = Isolate::Current()->heap(); |
if (enough_free_space && enough_free_time) { |
grow_heap_ = 0; |
} else { |
- if (FLAG_verbose_gc) { |
- OS::PrintErr("PageSpaceController: "); |
- if (!enough_free_space) { |
- OS::PrintErr("free space %d%% < %d%%", |
- collected_garbage_ratio, |
- heap_growth_ratio_); |
- } |
- if (!enough_free_space && !enough_free_time) { |
- OS::PrintErr(", "); |
- } |
- if (!enough_free_time) { |
- OS::PrintErr("garbage collection time %d%% > %d%%", |
- garbage_collection_time_fraction, |
- garbage_collection_time_ratio_); |
- } |
- OS::PrintErr("\n"); |
- } |
intptr_t growth_target = static_cast<intptr_t>(in_use_after / |
desired_utilization_); |
intptr_t growth_in_bytes = Utils::RoundUp(growth_target - in_use_after, |
PageSpace::kPageSize); |
int growth_in_pages = growth_in_bytes / PageSpace::kPageSize; |
grow_heap_ = Utils::Maximum(growth_in_pages, heap_growth_rate_); |
+ heap->RecordData(2, growth_in_pages); |
} |
+ heap->RecordData(0, collected_garbage_ratio); |
+ heap->RecordData(1, garbage_collection_time_fraction); |
+ heap->RecordData(3, grow_heap_); |
} |