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

Side by Side Diff: src/heap/heap.cc

Issue 1105293004: Add mode to reduce memory usage in idle notification. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address comments Created 5 years, 7 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 (collector == SCAVENGER) ? isolate_->counters()->gc_scavenger() 900 (collector == SCAVENGER) ? isolate_->counters()->gc_scavenger()
901 : isolate_->counters()->gc_compactor()); 901 : isolate_->counters()->gc_compactor());
902 next_gc_likely_to_collect_more = 902 next_gc_likely_to_collect_more =
903 PerformGarbageCollection(collector, gc_callback_flags); 903 PerformGarbageCollection(collector, gc_callback_flags);
904 } 904 }
905 905
906 GarbageCollectionEpilogue(); 906 GarbageCollectionEpilogue();
907 if (collector == MARK_COMPACTOR && FLAG_track_detached_contexts) { 907 if (collector == MARK_COMPACTOR && FLAG_track_detached_contexts) {
908 isolate()->CheckDetachedContextsAfterGC(); 908 isolate()->CheckDetachedContextsAfterGC();
909 } 909 }
910
911 if (collector == MARK_COMPACTOR) {
912 gc_idle_time_handler_.NotifyMarkCompact();
913 } else {
914 gc_idle_time_handler_.NotifyScavenge();
915 }
916
910 tracer()->Stop(collector); 917 tracer()->Stop(collector);
911 } 918 }
912 919
913 // Start incremental marking for the next cycle. The heap snapshot 920 // Start incremental marking for the next cycle. The heap snapshot
914 // generator needs incremental marking to stay off after it aborted. 921 // generator needs incremental marking to stay off after it aborted.
915 if (!mark_compact_collector()->abort_incremental_marking() && 922 if (!mark_compact_collector()->abort_incremental_marking() &&
916 incremental_marking()->IsStopped() && 923 incremental_marking()->IsStopped() &&
917 incremental_marking()->ShouldActivateEvenWithoutIdleNotification()) { 924 incremental_marking()->ShouldActivateEvenWithoutIdleNotification()) {
918 incremental_marking()->Start(); 925 incremental_marking()->Start();
919 } 926 }
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
1627 new_space_.LowerInlineAllocationLimit( 1634 new_space_.LowerInlineAllocationLimit(
1628 new_space_.inline_allocation_limit_step()); 1635 new_space_.inline_allocation_limit_step());
1629 1636
1630 // Update how much has survived scavenge. 1637 // Update how much has survived scavenge.
1631 IncrementYoungSurvivorsCounter(static_cast<int>( 1638 IncrementYoungSurvivorsCounter(static_cast<int>(
1632 (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size())); 1639 (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size()));
1633 1640
1634 LOG(isolate_, ResourceEvent("scavenge", "end")); 1641 LOG(isolate_, ResourceEvent("scavenge", "end"));
1635 1642
1636 gc_state_ = NOT_IN_GC; 1643 gc_state_ = NOT_IN_GC;
1637
1638 gc_idle_time_handler_.NotifyScavenge();
1639 } 1644 }
1640 1645
1641 1646
1642 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, 1647 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap,
1643 Object** p) { 1648 Object** p) {
1644 MapWord first_word = HeapObject::cast(*p)->map_word(); 1649 MapWord first_word = HeapObject::cast(*p)->map_word();
1645 1650
1646 if (!first_word.IsForwardingAddress()) { 1651 if (!first_word.IsForwardingAddress()) {
1647 // Unreachable external string can be finalized. 1652 // Unreachable external string can be finalized.
1648 heap->FinalizeExternalString(String::cast(*p)); 1653 heap->FinalizeExternalString(String::cast(*p));
(...skipping 2906 matching lines...) Expand 10 before | Expand all | Expand 10 after
4555 static_cast<size_t>(idle_time_in_ms))))) { 4560 static_cast<size_t>(idle_time_in_ms))))) {
4556 OverApproximateWeakClosure( 4561 OverApproximateWeakClosure(
4557 "Idle notification: overapproximate weak closure"); 4562 "Idle notification: overapproximate weak closure");
4558 return true; 4563 return true;
4559 } else if (incremental_marking()->IsComplete() || 4564 } else if (incremental_marking()->IsComplete() ||
4560 (mark_compact_collector_.marking_deque()->IsEmpty() && 4565 (mark_compact_collector_.marking_deque()->IsEmpty() &&
4561 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( 4566 gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact(
4562 static_cast<size_t>(idle_time_in_ms), size_of_objects, 4567 static_cast<size_t>(idle_time_in_ms), size_of_objects,
4563 final_incremental_mark_compact_speed_in_bytes_per_ms))) { 4568 final_incremental_mark_compact_speed_in_bytes_per_ms))) {
4564 CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); 4569 CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental");
4570 gc_idle_time_handler_.NotifyIdleMarkCompact();
4565 ReduceNewSpaceSize(is_long_idle_notification); 4571 ReduceNewSpaceSize(is_long_idle_notification);
4566 return true; 4572 return true;
4567 } 4573 }
4568 return false; 4574 return false;
4569 } 4575 }
4570 4576
4571 4577
4572 static double MonotonicallyIncreasingTimeInMs() { 4578 static double MonotonicallyIncreasingTimeInMs() {
4573 return V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * 4579 return V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() *
4574 static_cast<double>(base::Time::kMillisecondsPerSecond); 4580 static_cast<double>(base::Time::kMillisecondsPerSecond);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
4635 isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( 4641 isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample(
4636 static_cast<int>(idle_time_in_ms)); 4642 static_cast<int>(idle_time_in_ms));
4637 4643
4638 bool result = false; 4644 bool result = false;
4639 switch (action.type) { 4645 switch (action.type) {
4640 case DONE: 4646 case DONE:
4641 result = true; 4647 result = true;
4642 break; 4648 break;
4643 case DO_INCREMENTAL_MARKING: { 4649 case DO_INCREMENTAL_MARKING: {
4644 if (incremental_marking()->IsStopped()) { 4650 if (incremental_marking()->IsStopped()) {
4651 // TODO(ulan): take reduce_memory into account.
4645 incremental_marking()->Start(); 4652 incremental_marking()->Start();
4646 } 4653 }
4647 double remaining_idle_time_in_ms = 0.0; 4654 double remaining_idle_time_in_ms = 0.0;
4648 do { 4655 do {
4649 incremental_marking()->Step( 4656 incremental_marking()->Step(
4650 action.parameter, IncrementalMarking::NO_GC_VIA_STACK_GUARD, 4657 action.parameter, IncrementalMarking::NO_GC_VIA_STACK_GUARD,
4651 IncrementalMarking::FORCE_MARKING, 4658 IncrementalMarking::FORCE_MARKING,
4652 IncrementalMarking::DO_NOT_FORCE_COMPLETION); 4659 IncrementalMarking::DO_NOT_FORCE_COMPLETION);
4653 remaining_idle_time_in_ms = 4660 remaining_idle_time_in_ms =
4654 deadline_in_ms - MonotonicallyIncreasingTimeInMs(); 4661 deadline_in_ms - MonotonicallyIncreasingTimeInMs();
(...skipping 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after
6414 static_cast<int>(object_sizes_last_time_[index])); 6421 static_cast<int>(object_sizes_last_time_[index]));
6415 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6422 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6416 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6423 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6417 6424
6418 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6425 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6419 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6426 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6420 ClearObjectStats(); 6427 ClearObjectStats();
6421 } 6428 }
6422 } 6429 }
6423 } // namespace v8::internal 6430 } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698