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

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

Issue 1393773004: Reland "[heap] No leakage of mark-compact.h outside of heap." (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/heap/heap.h" 5 #include "src/heap/heap.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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 maximum_size_scavenges_(0), 115 maximum_size_scavenges_(0),
116 max_gc_pause_(0.0), 116 max_gc_pause_(0.0),
117 total_gc_time_ms_(0.0), 117 total_gc_time_ms_(0.0),
118 max_alive_after_gc_(0), 118 max_alive_after_gc_(0),
119 min_in_mutator_(kMaxInt), 119 min_in_mutator_(kMaxInt),
120 marking_time_(0.0), 120 marking_time_(0.0),
121 sweeping_time_(0.0), 121 sweeping_time_(0.0),
122 last_idle_notification_time_(0.0), 122 last_idle_notification_time_(0.0),
123 last_gc_time_(0.0), 123 last_gc_time_(0.0),
124 scavenge_collector_(nullptr), 124 scavenge_collector_(nullptr),
125 mark_compact_collector_(this), 125 mark_compact_collector_(nullptr),
126 store_buffer_(this), 126 store_buffer_(this),
127 incremental_marking_(nullptr), 127 incremental_marking_(nullptr),
128 gc_idle_time_handler_(nullptr), 128 gc_idle_time_handler_(nullptr),
129 memory_reducer_(nullptr), 129 memory_reducer_(nullptr),
130 object_stats_(nullptr), 130 object_stats_(nullptr),
131 scavenge_job_(nullptr), 131 scavenge_job_(nullptr),
132 full_codegen_bytes_generated_(0), 132 full_codegen_bytes_generated_(0),
133 crankshaft_codegen_bytes_generated_(0), 133 crankshaft_codegen_bytes_generated_(0),
134 new_space_allocation_counter_(0), 134 new_space_allocation_counter_(0),
135 old_generation_allocation_counter_(0), 135 old_generation_allocation_counter_(0),
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 } 951 }
952 952
953 if (collector == MARK_COMPACTOR && !ShouldFinalizeIncrementalMarking() && 953 if (collector == MARK_COMPACTOR && !ShouldFinalizeIncrementalMarking() &&
954 !ShouldAbortIncrementalMarking() && !incremental_marking()->IsStopped() && 954 !ShouldAbortIncrementalMarking() && !incremental_marking()->IsStopped() &&
955 !incremental_marking()->should_hurry() && FLAG_incremental_marking) { 955 !incremental_marking()->should_hurry() && FLAG_incremental_marking) {
956 // Make progress in incremental marking. 956 // Make progress in incremental marking.
957 const intptr_t kStepSizeWhenDelayedByScavenge = 1 * MB; 957 const intptr_t kStepSizeWhenDelayedByScavenge = 1 * MB;
958 incremental_marking()->Step(kStepSizeWhenDelayedByScavenge, 958 incremental_marking()->Step(kStepSizeWhenDelayedByScavenge,
959 IncrementalMarking::NO_GC_VIA_STACK_GUARD); 959 IncrementalMarking::NO_GC_VIA_STACK_GUARD);
960 if (!incremental_marking()->IsComplete() && 960 if (!incremental_marking()->IsComplete() &&
961 !mark_compact_collector_.marking_deque_.IsEmpty() && !FLAG_gc_global) { 961 !mark_compact_collector()->marking_deque_.IsEmpty() &&
962 !FLAG_gc_global) {
962 if (FLAG_trace_incremental_marking) { 963 if (FLAG_trace_incremental_marking) {
963 PrintF("[IncrementalMarking] Delaying MarkSweep.\n"); 964 PrintF("[IncrementalMarking] Delaying MarkSweep.\n");
964 } 965 }
965 collector = SCAVENGER; 966 collector = SCAVENGER;
966 collector_reason = "incremental marking delaying mark-sweep"; 967 collector_reason = "incremental marking delaying mark-sweep";
967 } 968 }
968 } 969 }
969 970
970 bool next_gc_likely_to_collect_more = false; 971 bool next_gc_likely_to_collect_more = false;
971 intptr_t committed_memory_before = 0; 972 intptr_t committed_memory_before = 0;
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 1292
1292 isolate_->counters()->objs_since_last_young()->Set(0); 1293 isolate_->counters()->objs_since_last_young()->Set(0);
1293 1294
1294 if (collector != SCAVENGER) { 1295 if (collector != SCAVENGER) {
1295 // Callbacks that fire after this point might trigger nested GCs and 1296 // Callbacks that fire after this point might trigger nested GCs and
1296 // restart incremental marking, the assertion can't be moved down. 1297 // restart incremental marking, the assertion can't be moved down.
1297 DCHECK(incremental_marking()->IsStopped()); 1298 DCHECK(incremental_marking()->IsStopped());
1298 1299
1299 // We finished a marking cycle. We can uncommit the marking deque until 1300 // We finished a marking cycle. We can uncommit the marking deque until
1300 // we start marking again. 1301 // we start marking again.
1301 mark_compact_collector_.marking_deque()->Uninitialize(); 1302 mark_compact_collector()->marking_deque()->Uninitialize();
1302 mark_compact_collector_.EnsureMarkingDequeIsCommitted( 1303 mark_compact_collector()->EnsureMarkingDequeIsCommitted(
1303 MarkCompactCollector::kMinMarkingDequeSize); 1304 MarkCompactCollector::kMinMarkingDequeSize);
1304 } 1305 }
1305 1306
1306 gc_post_processing_depth_++; 1307 gc_post_processing_depth_++;
1307 { 1308 {
1308 AllowHeapAllocation allow_allocation; 1309 AllowHeapAllocation allow_allocation;
1309 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); 1310 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL);
1310 freed_global_handles = 1311 freed_global_handles =
1311 isolate_->global_handles()->PostGarbageCollectionProcessing( 1312 isolate_->global_handles()->PostGarbageCollectionProcessing(
1312 collector, gc_callback_flags); 1313 collector, gc_callback_flags);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 } 1387 }
1387 } 1388 }
1388 1389
1389 1390
1390 void Heap::MarkCompact() { 1391 void Heap::MarkCompact() {
1391 gc_state_ = MARK_COMPACT; 1392 gc_state_ = MARK_COMPACT;
1392 LOG(isolate_, ResourceEvent("markcompact", "begin")); 1393 LOG(isolate_, ResourceEvent("markcompact", "begin"));
1393 1394
1394 uint64_t size_of_objects_before_gc = SizeOfObjects(); 1395 uint64_t size_of_objects_before_gc = SizeOfObjects();
1395 1396
1396 mark_compact_collector_.Prepare(); 1397 mark_compact_collector()->Prepare();
1397 1398
1398 ms_count_++; 1399 ms_count_++;
1399 1400
1400 MarkCompactPrologue(); 1401 MarkCompactPrologue();
1401 1402
1402 mark_compact_collector_.CollectGarbage(); 1403 mark_compact_collector()->CollectGarbage();
1403 1404
1404 LOG(isolate_, ResourceEvent("markcompact", "end")); 1405 LOG(isolate_, ResourceEvent("markcompact", "end"));
1405 1406
1406 MarkCompactEpilogue(); 1407 MarkCompactEpilogue();
1407 1408
1408 if (FLAG_allocation_site_pretenuring) { 1409 if (FLAG_allocation_site_pretenuring) {
1409 EvaluateOldSpaceLocalPretenuring(size_of_objects_before_gc); 1410 EvaluateOldSpaceLocalPretenuring(size_of_objects_before_gc);
1410 } 1411 }
1411 } 1412 }
1412 1413
(...skipping 2651 matching lines...) Expand 10 before | Expand all | Expand 10 after
4064 new_space_.Shrink(); 4065 new_space_.Shrink();
4065 UncommitFromSpace(); 4066 UncommitFromSpace();
4066 } 4067 }
4067 } 4068 }
4068 4069
4069 4070
4070 void Heap::FinalizeIncrementalMarkingIfComplete(const char* comment) { 4071 void Heap::FinalizeIncrementalMarkingIfComplete(const char* comment) {
4071 if (FLAG_overapproximate_weak_closure && incremental_marking()->IsMarking() && 4072 if (FLAG_overapproximate_weak_closure && incremental_marking()->IsMarking() &&
4072 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || 4073 (incremental_marking()->IsReadyToOverApproximateWeakClosure() ||
4073 (!incremental_marking()->weak_closure_was_overapproximated() && 4074 (!incremental_marking()->weak_closure_was_overapproximated() &&
4074 mark_compact_collector_.marking_deque()->IsEmpty()))) { 4075 mark_compact_collector()->marking_deque()->IsEmpty()))) {
4075 OverApproximateWeakClosure(comment); 4076 OverApproximateWeakClosure(comment);
4076 } else if (incremental_marking()->IsComplete() || 4077 } else if (incremental_marking()->IsComplete() ||
4077 (mark_compact_collector_.marking_deque()->IsEmpty())) { 4078 (mark_compact_collector()->marking_deque()->IsEmpty())) {
4078 CollectAllGarbage(current_gc_flags_, comment); 4079 CollectAllGarbage(current_gc_flags_, comment);
4079 } 4080 }
4080 } 4081 }
4081 4082
4082 4083
4083 bool Heap::TryFinalizeIdleIncrementalMarking(double idle_time_in_ms) { 4084 bool Heap::TryFinalizeIdleIncrementalMarking(double idle_time_in_ms) {
4084 size_t size_of_objects = static_cast<size_t>(SizeOfObjects()); 4085 size_t size_of_objects = static_cast<size_t>(SizeOfObjects());
4085 size_t final_incremental_mark_compact_speed_in_bytes_per_ms = 4086 size_t final_incremental_mark_compact_speed_in_bytes_per_ms =
4086 static_cast<size_t>( 4087 static_cast<size_t>(
4087 tracer()->FinalIncrementalMarkCompactSpeedInBytesPerMillisecond()); 4088 tracer()->FinalIncrementalMarkCompactSpeedInBytesPerMillisecond());
4088 if (FLAG_overapproximate_weak_closure && 4089 if (FLAG_overapproximate_weak_closure &&
4089 (incremental_marking()->IsReadyToOverApproximateWeakClosure() || 4090 (incremental_marking()->IsReadyToOverApproximateWeakClosure() ||
4090 (!incremental_marking()->weak_closure_was_overapproximated() && 4091 (!incremental_marking()->weak_closure_was_overapproximated() &&
4091 mark_compact_collector_.marking_deque()->IsEmpty() && 4092 mark_compact_collector()->marking_deque()->IsEmpty() &&
4092 gc_idle_time_handler_->ShouldDoOverApproximateWeakClosure( 4093 gc_idle_time_handler_->ShouldDoOverApproximateWeakClosure(
4093 static_cast<size_t>(idle_time_in_ms))))) { 4094 static_cast<size_t>(idle_time_in_ms))))) {
4094 OverApproximateWeakClosure( 4095 OverApproximateWeakClosure(
4095 "Idle notification: overapproximate weak closure"); 4096 "Idle notification: overapproximate weak closure");
4096 return true; 4097 return true;
4097 } else if (incremental_marking()->IsComplete() || 4098 } else if (incremental_marking()->IsComplete() ||
4098 (mark_compact_collector_.marking_deque()->IsEmpty() && 4099 (mark_compact_collector()->marking_deque()->IsEmpty() &&
4099 gc_idle_time_handler_->ShouldDoFinalIncrementalMarkCompact( 4100 gc_idle_time_handler_->ShouldDoFinalIncrementalMarkCompact(
4100 static_cast<size_t>(idle_time_in_ms), size_of_objects, 4101 static_cast<size_t>(idle_time_in_ms), size_of_objects,
4101 final_incremental_mark_compact_speed_in_bytes_per_ms))) { 4102 final_incremental_mark_compact_speed_in_bytes_per_ms))) {
4102 CollectAllGarbage(current_gc_flags_, 4103 CollectAllGarbage(current_gc_flags_,
4103 "idle notification: finalize incremental"); 4104 "idle notification: finalize incremental");
4104 return true; 4105 return true;
4105 } 4106 }
4106 return false; 4107 return false;
4107 } 4108 }
4108 4109
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
4410 new_space_.Verify(); 4411 new_space_.Verify();
4411 4412
4412 old_space_->Verify(&visitor); 4413 old_space_->Verify(&visitor);
4413 map_space_->Verify(&visitor); 4414 map_space_->Verify(&visitor);
4414 4415
4415 VerifyPointersVisitor no_dirty_regions_visitor; 4416 VerifyPointersVisitor no_dirty_regions_visitor;
4416 code_space_->Verify(&no_dirty_regions_visitor); 4417 code_space_->Verify(&no_dirty_regions_visitor);
4417 4418
4418 lo_space_->Verify(); 4419 lo_space_->Verify();
4419 4420
4420 mark_compact_collector_.VerifyWeakEmbeddedObjectsInCode(); 4421 mark_compact_collector()->VerifyWeakEmbeddedObjectsInCode();
4421 if (FLAG_omit_map_checks_for_leaf_maps) { 4422 if (FLAG_omit_map_checks_for_leaf_maps) {
4422 mark_compact_collector_.VerifyOmittedMapChecks(); 4423 mark_compact_collector()->VerifyOmittedMapChecks();
4423 } 4424 }
4424 } 4425 }
4425 #endif 4426 #endif
4426 4427
4427 4428
4428 void Heap::ZapFromSpace() { 4429 void Heap::ZapFromSpace() {
4429 if (!new_space_.IsFromSpaceCommitted()) return; 4430 if (!new_space_.IsFromSpaceCommitted()) return;
4430 NewSpacePageIterator it(new_space_.FromSpaceStart(), 4431 NewSpacePageIterator it(new_space_.FromSpaceStart(),
4431 new_space_.FromSpaceEnd()); 4432 new_space_.FromSpaceEnd());
4432 while (it.has_next()) { 4433 while (it.has_next()) {
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
5062 5063
5063 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount); 5064 for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount);
5064 i++) { 5065 i++) {
5065 deferred_counters_[i] = 0; 5066 deferred_counters_[i] = 0;
5066 } 5067 }
5067 5068
5068 tracer_ = new GCTracer(this); 5069 tracer_ = new GCTracer(this);
5069 5070
5070 scavenge_collector_ = new Scavenger(this); 5071 scavenge_collector_ = new Scavenger(this);
5071 5072
5073 mark_compact_collector_ = new MarkCompactCollector(this);
5074
5072 gc_idle_time_handler_ = new GCIdleTimeHandler(); 5075 gc_idle_time_handler_ = new GCIdleTimeHandler();
5073 5076
5074 memory_reducer_ = new MemoryReducer(this); 5077 memory_reducer_ = new MemoryReducer(this);
5075 5078
5076 object_stats_ = new ObjectStats(this); 5079 object_stats_ = new ObjectStats(this);
5077 object_stats_->ClearObjectStats(true); 5080 object_stats_->ClearObjectStats(true);
5078 5081
5079 scavenge_job_ = new ScavengeJob(); 5082 scavenge_job_ = new ScavengeJob();
5080 5083
5081 array_buffer_tracker_ = new ArrayBufferTracker(this); 5084 array_buffer_tracker_ = new ArrayBufferTracker(this);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
5182 PrintF("\n\n"); 5185 PrintF("\n\n");
5183 } 5186 }
5184 5187
5185 if (FLAG_verify_predictable) { 5188 if (FLAG_verify_predictable) {
5186 PrintAlloctionsHash(); 5189 PrintAlloctionsHash();
5187 } 5190 }
5188 5191
5189 delete scavenge_collector_; 5192 delete scavenge_collector_;
5190 scavenge_collector_ = nullptr; 5193 scavenge_collector_ = nullptr;
5191 5194
5195 if (mark_compact_collector_ != nullptr) {
5196 mark_compact_collector_->TearDown();
5197 delete mark_compact_collector_;
5198 mark_compact_collector_ = nullptr;
5199 }
5200
5192 delete incremental_marking_; 5201 delete incremental_marking_;
5193 incremental_marking_ = nullptr; 5202 incremental_marking_ = nullptr;
5194 5203
5195 delete gc_idle_time_handler_; 5204 delete gc_idle_time_handler_;
5196 gc_idle_time_handler_ = nullptr; 5205 gc_idle_time_handler_ = nullptr;
5197 5206
5198 if (memory_reducer_ != nullptr) { 5207 if (memory_reducer_ != nullptr) {
5199 memory_reducer_->TearDown(); 5208 memory_reducer_->TearDown();
5200 delete memory_reducer_; 5209 delete memory_reducer_;
5201 memory_reducer_ = nullptr; 5210 memory_reducer_ = nullptr;
5202 } 5211 }
5203 5212
5204 delete object_stats_; 5213 delete object_stats_;
5205 object_stats_ = nullptr; 5214 object_stats_ = nullptr;
5206 5215
5207 delete scavenge_job_; 5216 delete scavenge_job_;
5208 scavenge_job_ = nullptr; 5217 scavenge_job_ = nullptr;
5209 5218
5210 WaitUntilUnmappingOfFreeChunksCompleted(); 5219 WaitUntilUnmappingOfFreeChunksCompleted();
5211 5220
5212 delete array_buffer_tracker_; 5221 delete array_buffer_tracker_;
5213 array_buffer_tracker_ = nullptr; 5222 array_buffer_tracker_ = nullptr;
5214 5223
5215 isolate_->global_handles()->TearDown(); 5224 isolate_->global_handles()->TearDown();
5216 5225
5217 external_string_table_.TearDown(); 5226 external_string_table_.TearDown();
5218 5227
5219 mark_compact_collector()->TearDown();
5220
5221 delete tracer_; 5228 delete tracer_;
5222 tracer_ = nullptr; 5229 tracer_ = nullptr;
5223 5230
5224 new_space_.TearDown(); 5231 new_space_.TearDown();
5225 5232
5226 if (old_space_ != NULL) { 5233 if (old_space_ != NULL) {
5227 delete old_space_; 5234 delete old_space_;
5228 old_space_ = NULL; 5235 old_space_ = NULL;
5229 } 5236 }
5230 5237
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after
6113 } 6120 }
6114 6121
6115 6122
6116 // static 6123 // static
6117 int Heap::GetStaticVisitorIdForMap(Map* map) { 6124 int Heap::GetStaticVisitorIdForMap(Map* map) {
6118 return StaticVisitorBase::GetVisitorId(map); 6125 return StaticVisitorBase::GetVisitorId(map);
6119 } 6126 }
6120 6127
6121 } // namespace internal 6128 } // namespace internal
6122 } // namespace v8 6129 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698