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

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

Issue 1862653002: Move MemoryAllocator and CodeRange into Heap (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 8 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/spaces.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/ast/scopeinfo.h" 9 #include "src/ast/scopeinfo.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated); 64 heap_.ScheduleIdleScavengeIfNeeded(bytes_allocated);
65 } 65 }
66 66
67 private: 67 private:
68 Heap& heap_; 68 Heap& heap_;
69 }; 69 };
70 70
71 Heap::Heap() 71 Heap::Heap()
72 : amount_of_external_allocated_memory_(0), 72 : amount_of_external_allocated_memory_(0),
73 amount_of_external_allocated_memory_at_last_global_gc_(0), 73 amount_of_external_allocated_memory_at_last_global_gc_(0),
74 isolate_(NULL), 74 isolate_(nullptr),
75 code_range_size_(0), 75 code_range_size_(0),
76 // semispace_size_ should be a power of 2 and old_generation_size_ should 76 // semispace_size_ should be a power of 2 and old_generation_size_ should
77 // be a multiple of Page::kPageSize. 77 // be a multiple of Page::kPageSize.
78 max_semi_space_size_(8 * (kPointerSize / 4) * MB), 78 max_semi_space_size_(8 * (kPointerSize / 4) * MB),
79 initial_semispace_size_(Page::kPageSize), 79 initial_semispace_size_(Page::kPageSize),
80 max_old_generation_size_(700ul * (kPointerSize / 4) * MB), 80 max_old_generation_size_(700ul * (kPointerSize / 4) * MB),
81 initial_old_generation_size_(max_old_generation_size_ / 81 initial_old_generation_size_(max_old_generation_size_ /
82 kInitalOldGenerationLimitFactor), 82 kInitalOldGenerationLimitFactor),
83 old_generation_size_configured_(false), 83 old_generation_size_configured_(false),
84 max_executable_size_(256ul * (kPointerSize / 4) * MB), 84 max_executable_size_(256ul * (kPointerSize / 4) * MB),
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 max_gc_pause_(0.0), 129 max_gc_pause_(0.0),
130 total_gc_time_ms_(0.0), 130 total_gc_time_ms_(0.0),
131 max_alive_after_gc_(0), 131 max_alive_after_gc_(0),
132 min_in_mutator_(kMaxInt), 132 min_in_mutator_(kMaxInt),
133 marking_time_(0.0), 133 marking_time_(0.0),
134 sweeping_time_(0.0), 134 sweeping_time_(0.0),
135 last_idle_notification_time_(0.0), 135 last_idle_notification_time_(0.0),
136 last_gc_time_(0.0), 136 last_gc_time_(0.0),
137 scavenge_collector_(nullptr), 137 scavenge_collector_(nullptr),
138 mark_compact_collector_(nullptr), 138 mark_compact_collector_(nullptr),
139 memory_allocator_(nullptr),
139 store_buffer_(this), 140 store_buffer_(this),
140 incremental_marking_(nullptr), 141 incremental_marking_(nullptr),
141 gc_idle_time_handler_(nullptr), 142 gc_idle_time_handler_(nullptr),
142 memory_reducer_(nullptr), 143 memory_reducer_(nullptr),
143 object_stats_(nullptr), 144 object_stats_(nullptr),
144 scavenge_job_(nullptr), 145 scavenge_job_(nullptr),
145 idle_scavenge_observer_(nullptr), 146 idle_scavenge_observer_(nullptr),
146 full_codegen_bytes_generated_(0), 147 full_codegen_bytes_generated_(0),
147 crankshaft_codegen_bytes_generated_(0), 148 crankshaft_codegen_bytes_generated_(0),
148 new_space_allocation_counter_(0), 149 new_space_allocation_counter_(0),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 old_space_->CommittedPhysicalMemory() + 219 old_space_->CommittedPhysicalMemory() +
219 code_space_->CommittedPhysicalMemory() + 220 code_space_->CommittedPhysicalMemory() +
220 map_space_->CommittedPhysicalMemory() + 221 map_space_->CommittedPhysicalMemory() +
221 lo_space_->CommittedPhysicalMemory(); 222 lo_space_->CommittedPhysicalMemory();
222 } 223 }
223 224
224 225
225 intptr_t Heap::CommittedMemoryExecutable() { 226 intptr_t Heap::CommittedMemoryExecutable() {
226 if (!HasBeenSetUp()) return 0; 227 if (!HasBeenSetUp()) return 0;
227 228
228 return isolate()->memory_allocator()->SizeExecutable(); 229 return memory_allocator()->SizeExecutable();
229 } 230 }
230 231
231 232
232 void Heap::UpdateMaximumCommitted() { 233 void Heap::UpdateMaximumCommitted() {
233 if (!HasBeenSetUp()) return; 234 if (!HasBeenSetUp()) return;
234 235
235 intptr_t current_committed_memory = CommittedMemory(); 236 intptr_t current_committed_memory = CommittedMemory();
236 if (current_committed_memory > maximum_committed_) { 237 if (current_committed_memory > maximum_committed_) {
237 maximum_committed_ = current_committed_memory; 238 maximum_committed_ = current_committed_memory;
238 } 239 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 290
290 // Is there enough space left in OLD to guarantee that a scavenge can 291 // Is there enough space left in OLD to guarantee that a scavenge can
291 // succeed? 292 // succeed?
292 // 293 //
293 // Note that MemoryAllocator->MaxAvailable() undercounts the memory available 294 // Note that MemoryAllocator->MaxAvailable() undercounts the memory available
294 // for object promotion. It counts only the bytes that the memory 295 // for object promotion. It counts only the bytes that the memory
295 // allocator has not yet allocated from the OS and assigned to any space, 296 // allocator has not yet allocated from the OS and assigned to any space,
296 // and does not count available bytes already in the old space or code 297 // and does not count available bytes already in the old space or code
297 // space. Undercounting is safe---we may get an unrequested full GC when 298 // space. Undercounting is safe---we may get an unrequested full GC when
298 // a scavenge would have succeeded. 299 // a scavenge would have succeeded.
299 if (isolate_->memory_allocator()->MaxAvailable() <= new_space_.Size()) { 300 if (memory_allocator()->MaxAvailable() <= new_space_.Size()) {
300 isolate_->counters() 301 isolate_->counters()
301 ->gc_compactor_caused_by_oldspace_exhaustion() 302 ->gc_compactor_caused_by_oldspace_exhaustion()
302 ->Increment(); 303 ->Increment();
303 *reason = "scavenge might not succeed"; 304 *reason = "scavenge might not succeed";
304 return MARK_COMPACTOR; 305 return MARK_COMPACTOR;
305 } 306 }
306 307
307 // Default 308 // Default
308 *reason = NULL; 309 *reason = NULL;
309 return SCAVENGER; 310 return SCAVENGER;
(...skipping 22 matching lines...) Expand all
332 } 333 }
333 #endif // DEBUG 334 #endif // DEBUG
334 } 335 }
335 336
336 337
337 void Heap::PrintShortHeapStatistics() { 338 void Heap::PrintShortHeapStatistics() {
338 if (!FLAG_trace_gc_verbose) return; 339 if (!FLAG_trace_gc_verbose) return;
339 PrintIsolate(isolate_, "Memory allocator, used: %6" V8_PTR_PREFIX 340 PrintIsolate(isolate_, "Memory allocator, used: %6" V8_PTR_PREFIX
340 "d KB" 341 "d KB"
341 ", available: %6" V8_PTR_PREFIX "d KB\n", 342 ", available: %6" V8_PTR_PREFIX "d KB\n",
342 isolate_->memory_allocator()->Size() / KB, 343 memory_allocator()->Size() / KB,
343 isolate_->memory_allocator()->Available() / KB); 344 memory_allocator()->Available() / KB);
344 PrintIsolate(isolate_, "New space, used: %6" V8_PTR_PREFIX 345 PrintIsolate(isolate_, "New space, used: %6" V8_PTR_PREFIX
345 "d KB" 346 "d KB"
346 ", available: %6" V8_PTR_PREFIX 347 ", available: %6" V8_PTR_PREFIX
347 "d KB" 348 "d KB"
348 ", committed: %6" V8_PTR_PREFIX "d KB\n", 349 ", committed: %6" V8_PTR_PREFIX "d KB\n",
349 new_space_.Size() / KB, new_space_.Available() / KB, 350 new_space_.Size() / KB, new_space_.Available() / KB,
350 new_space_.CommittedMemory() / KB); 351 new_space_.CommittedMemory() / KB);
351 PrintIsolate(isolate_, "Old space, used: %6" V8_PTR_PREFIX 352 PrintIsolate(isolate_, "Old space, used: %6" V8_PTR_PREFIX
352 "d KB" 353 "d KB"
353 ", available: %6" V8_PTR_PREFIX 354 ", available: %6" V8_PTR_PREFIX
(...skipping 3012 matching lines...) Expand 10 before | Expand all | Expand 10 after
3366 ClearRecordedSlots::kNo); 3367 ClearRecordedSlots::kNo);
3367 allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE); 3368 allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE);
3368 if (!allocation.To(&result)) return allocation; 3369 if (!allocation.To(&result)) return allocation;
3369 OnAllocationEvent(result, object_size); 3370 OnAllocationEvent(result, object_size);
3370 } 3371 }
3371 } 3372 }
3372 3373
3373 result->set_map_no_write_barrier(code_map()); 3374 result->set_map_no_write_barrier(code_map());
3374 Code* code = Code::cast(result); 3375 Code* code = Code::cast(result);
3375 DCHECK(IsAligned(bit_cast<intptr_t>(code->address()), kCodeAlignment)); 3376 DCHECK(IsAligned(bit_cast<intptr_t>(code->address()), kCodeAlignment));
3376 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || 3377 DCHECK(memory_allocator()->code_range() == NULL ||
3377 isolate_->code_range()->contains(code->address()) || 3378 !memory_allocator()->code_range()->valid() ||
3379 memory_allocator()->code_range()->contains(code->address()) ||
3378 object_size <= code_space()->AreaSize()); 3380 object_size <= code_space()->AreaSize());
3379 code->set_gc_metadata(Smi::FromInt(0)); 3381 code->set_gc_metadata(Smi::FromInt(0));
3380 code->set_ic_age(global_ic_age_); 3382 code->set_ic_age(global_ic_age_);
3381 return code; 3383 return code;
3382 } 3384 }
3383 3385
3384 3386
3385 AllocationResult Heap::CopyCode(Code* code) { 3387 AllocationResult Heap::CopyCode(Code* code) {
3386 AllocationResult allocation; 3388 AllocationResult allocation;
3387 3389
3388 HeapObject* result = nullptr; 3390 HeapObject* result = nullptr;
3389 // Allocate an object the same size as the code object. 3391 // Allocate an object the same size as the code object.
3390 int obj_size = code->Size(); 3392 int obj_size = code->Size();
3391 allocation = AllocateRaw(obj_size, CODE_SPACE); 3393 allocation = AllocateRaw(obj_size, CODE_SPACE);
3392 if (!allocation.To(&result)) return allocation; 3394 if (!allocation.To(&result)) return allocation;
3393 3395
3394 // Copy code object. 3396 // Copy code object.
3395 Address old_addr = code->address(); 3397 Address old_addr = code->address();
3396 Address new_addr = result->address(); 3398 Address new_addr = result->address();
3397 CopyBlock(new_addr, old_addr, obj_size); 3399 CopyBlock(new_addr, old_addr, obj_size);
3398 Code* new_code = Code::cast(result); 3400 Code* new_code = Code::cast(result);
3399 3401
3400 // Relocate the copy. 3402 // Relocate the copy.
3401 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); 3403 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment));
3402 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || 3404 DCHECK(memory_allocator()->code_range() == NULL ||
3403 isolate_->code_range()->contains(code->address()) || 3405 !memory_allocator()->code_range()->valid() ||
3406 memory_allocator()->code_range()->contains(code->address()) ||
3404 obj_size <= code_space()->AreaSize()); 3407 obj_size <= code_space()->AreaSize());
3405 new_code->Relocate(new_addr - old_addr); 3408 new_code->Relocate(new_addr - old_addr);
3406 // We have to iterate over the object and process its pointers when black 3409 // We have to iterate over the object and process its pointers when black
3407 // allocation is on. 3410 // allocation is on.
3408 incremental_marking()->IterateBlackObject(new_code); 3411 incremental_marking()->IterateBlackObject(new_code);
3409 return new_code; 3412 return new_code;
3410 } 3413 }
3411 3414
3412 AllocationResult Heap::CopyBytecodeArray(BytecodeArray* bytecode_array) { 3415 AllocationResult Heap::CopyBytecodeArray(BytecodeArray* bytecode_array) {
3413 int size = BytecodeArray::SizeFor(bytecode_array->length()); 3416 int size = BytecodeArray::SizeFor(bytecode_array->length());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3461 3464
3462 Code* new_code = Code::cast(result); 3465 Code* new_code = Code::cast(result);
3463 new_code->set_relocation_info(reloc_info_array); 3466 new_code->set_relocation_info(reloc_info_array);
3464 3467
3465 // Copy patched rinfo. 3468 // Copy patched rinfo.
3466 CopyBytes(new_code->relocation_start(), reloc_info.start(), 3469 CopyBytes(new_code->relocation_start(), reloc_info.start(),
3467 static_cast<size_t>(reloc_info.length())); 3470 static_cast<size_t>(reloc_info.length()));
3468 3471
3469 // Relocate the copy. 3472 // Relocate the copy.
3470 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment)); 3473 DCHECK(IsAligned(bit_cast<intptr_t>(new_code->address()), kCodeAlignment));
3471 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || 3474 DCHECK(memory_allocator()->code_range() == NULL ||
3472 isolate_->code_range()->contains(code->address()) || 3475 !memory_allocator()->code_range()->valid() ||
3476 memory_allocator()->code_range()->contains(code->address()) ||
3473 new_obj_size <= code_space()->AreaSize()); 3477 new_obj_size <= code_space()->AreaSize());
3474 3478
3475 new_code->Relocate(new_addr - old_addr); 3479 new_code->Relocate(new_addr - old_addr);
3476 // We have to iterate over over the object and process its pointers when 3480 // We have to iterate over over the object and process its pointers when
3477 // black allocation is on. 3481 // black allocation is on.
3478 incremental_marking()->IterateBlackObject(new_code); 3482 incremental_marking()->IterateBlackObject(new_code);
3479 #ifdef VERIFY_HEAP 3483 #ifdef VERIFY_HEAP
3480 if (FLAG_verify_heap) code->ObjectVerify(); 3484 if (FLAG_verify_heap) code->ObjectVerify();
3481 #endif 3485 #endif
3482 return new_code; 3486 return new_code;
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after
4507 gc_count_); 4511 gc_count_);
4508 PrintF("old_generation_allocation_limit_ %" V8_PTR_PREFIX "d\n", 4512 PrintF("old_generation_allocation_limit_ %" V8_PTR_PREFIX "d\n",
4509 old_generation_allocation_limit_); 4513 old_generation_allocation_limit_);
4510 4514
4511 PrintF("\n"); 4515 PrintF("\n");
4512 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_)); 4516 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_));
4513 isolate_->global_handles()->PrintStats(); 4517 isolate_->global_handles()->PrintStats();
4514 PrintF("\n"); 4518 PrintF("\n");
4515 4519
4516 PrintF("Heap statistics : "); 4520 PrintF("Heap statistics : ");
4517 isolate_->memory_allocator()->ReportStatistics(); 4521 memory_allocator()->ReportStatistics();
4518 PrintF("To space : "); 4522 PrintF("To space : ");
4519 new_space_.ReportStatistics(); 4523 new_space_.ReportStatistics();
4520 PrintF("Old space : "); 4524 PrintF("Old space : ");
4521 old_space_->ReportStatistics(); 4525 old_space_->ReportStatistics();
4522 PrintF("Code space : "); 4526 PrintF("Code space : ");
4523 code_space_->ReportStatistics(); 4527 code_space_->ReportStatistics();
4524 PrintF("Map space : "); 4528 PrintF("Map space : ");
4525 map_space_->ReportStatistics(); 4529 map_space_->ReportStatistics();
4526 PrintF("Large object space : "); 4530 PrintF("Large object space : ");
4527 lo_space_->ReportStatistics(); 4531 lo_space_->ReportStatistics();
4528 PrintF(">>>>>> ========================================= >>>>>>\n"); 4532 PrintF(">>>>>> ========================================= >>>>>>\n");
4529 } 4533 }
4530 4534
4531 #endif // DEBUG 4535 #endif // DEBUG
4532 4536
4533 bool Heap::Contains(HeapObject* value) { 4537 bool Heap::Contains(HeapObject* value) {
4534 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(value->address())) { 4538 if (memory_allocator()->IsOutsideAllocatedSpace(value->address())) {
4535 return false; 4539 return false;
4536 } 4540 }
4537 return HasBeenSetUp() && 4541 return HasBeenSetUp() &&
4538 (new_space_.ToSpaceContains(value) || old_space_->Contains(value) || 4542 (new_space_.ToSpaceContains(value) || old_space_->Contains(value) ||
4539 code_space_->Contains(value) || map_space_->Contains(value) || 4543 code_space_->Contains(value) || map_space_->Contains(value) ||
4540 lo_space_->Contains(value)); 4544 lo_space_->Contains(value));
4541 } 4545 }
4542 4546
4543 bool Heap::ContainsSlow(Address addr) { 4547 bool Heap::ContainsSlow(Address addr) {
4544 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) { 4548 if (memory_allocator()->IsOutsideAllocatedSpace(addr)) {
4545 return false; 4549 return false;
4546 } 4550 }
4547 return HasBeenSetUp() && 4551 return HasBeenSetUp() &&
4548 (new_space_.ToSpaceContainsSlow(addr) || 4552 (new_space_.ToSpaceContainsSlow(addr) ||
4549 old_space_->ContainsSlow(addr) || code_space_->ContainsSlow(addr) || 4553 old_space_->ContainsSlow(addr) || code_space_->ContainsSlow(addr) ||
4550 map_space_->ContainsSlow(addr) || lo_space_->ContainsSlow(addr)); 4554 map_space_->ContainsSlow(addr) || lo_space_->ContainsSlow(addr));
4551 } 4555 }
4552 4556
4553 bool Heap::InSpace(HeapObject* value, AllocationSpace space) { 4557 bool Heap::InSpace(HeapObject* value, AllocationSpace space) {
4554 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(value->address())) { 4558 if (memory_allocator()->IsOutsideAllocatedSpace(value->address())) {
4555 return false; 4559 return false;
4556 } 4560 }
4557 if (!HasBeenSetUp()) return false; 4561 if (!HasBeenSetUp()) return false;
4558 4562
4559 switch (space) { 4563 switch (space) {
4560 case NEW_SPACE: 4564 case NEW_SPACE:
4561 return new_space_.ToSpaceContains(value); 4565 return new_space_.ToSpaceContains(value);
4562 case OLD_SPACE: 4566 case OLD_SPACE:
4563 return old_space_->Contains(value); 4567 return old_space_->Contains(value);
4564 case CODE_SPACE: 4568 case CODE_SPACE:
4565 return code_space_->Contains(value); 4569 return code_space_->Contains(value);
4566 case MAP_SPACE: 4570 case MAP_SPACE:
4567 return map_space_->Contains(value); 4571 return map_space_->Contains(value);
4568 case LO_SPACE: 4572 case LO_SPACE:
4569 return lo_space_->Contains(value); 4573 return lo_space_->Contains(value);
4570 } 4574 }
4571 UNREACHABLE(); 4575 UNREACHABLE();
4572 return false; 4576 return false;
4573 } 4577 }
4574 4578
4575 bool Heap::InSpaceSlow(Address addr, AllocationSpace space) { 4579 bool Heap::InSpaceSlow(Address addr, AllocationSpace space) {
4576 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) { 4580 if (memory_allocator()->IsOutsideAllocatedSpace(addr)) {
4577 return false; 4581 return false;
4578 } 4582 }
4579 if (!HasBeenSetUp()) return false; 4583 if (!HasBeenSetUp()) return false;
4580 4584
4581 switch (space) { 4585 switch (space) {
4582 case NEW_SPACE: 4586 case NEW_SPACE:
4583 return new_space_.ToSpaceContainsSlow(addr); 4587 return new_space_.ToSpaceContainsSlow(addr);
4584 case OLD_SPACE: 4588 case OLD_SPACE:
4585 return old_space_->ContainsSlow(addr); 4589 return old_space_->ContainsSlow(addr);
4586 case CODE_SPACE: 4590 case CODE_SPACE:
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
5007 *stats->new_space_size = new_space_.SizeAsInt(); 5011 *stats->new_space_size = new_space_.SizeAsInt();
5008 *stats->new_space_capacity = static_cast<int>(new_space_.Capacity()); 5012 *stats->new_space_capacity = static_cast<int>(new_space_.Capacity());
5009 *stats->old_space_size = old_space_->SizeOfObjects(); 5013 *stats->old_space_size = old_space_->SizeOfObjects();
5010 *stats->old_space_capacity = old_space_->Capacity(); 5014 *stats->old_space_capacity = old_space_->Capacity();
5011 *stats->code_space_size = code_space_->SizeOfObjects(); 5015 *stats->code_space_size = code_space_->SizeOfObjects();
5012 *stats->code_space_capacity = code_space_->Capacity(); 5016 *stats->code_space_capacity = code_space_->Capacity();
5013 *stats->map_space_size = map_space_->SizeOfObjects(); 5017 *stats->map_space_size = map_space_->SizeOfObjects();
5014 *stats->map_space_capacity = map_space_->Capacity(); 5018 *stats->map_space_capacity = map_space_->Capacity();
5015 *stats->lo_space_size = lo_space_->Size(); 5019 *stats->lo_space_size = lo_space_->Size();
5016 isolate_->global_handles()->RecordStats(stats); 5020 isolate_->global_handles()->RecordStats(stats);
5017 *stats->memory_allocator_size = isolate()->memory_allocator()->Size(); 5021 *stats->memory_allocator_size = memory_allocator()->Size();
5018 *stats->memory_allocator_capacity = 5022 *stats->memory_allocator_capacity =
5019 isolate()->memory_allocator()->Size() + 5023 memory_allocator()->Size() + memory_allocator()->Available();
5020 isolate()->memory_allocator()->Available();
5021 *stats->os_error = base::OS::GetLastError(); 5024 *stats->os_error = base::OS::GetLastError();
5022 isolate()->memory_allocator()->Available(); 5025 memory_allocator()->Available();
5023 if (take_snapshot) { 5026 if (take_snapshot) {
5024 HeapIterator iterator(this); 5027 HeapIterator iterator(this);
5025 for (HeapObject* obj = iterator.next(); obj != NULL; 5028 for (HeapObject* obj = iterator.next(); obj != NULL;
5026 obj = iterator.next()) { 5029 obj = iterator.next()) {
5027 InstanceType type = obj->map()->instance_type(); 5030 InstanceType type = obj->map()->instance_type();
5028 DCHECK(0 <= type && type <= LAST_TYPE); 5031 DCHECK(0 <= type && type <= LAST_TYPE);
5029 stats->objects_per_type[type]++; 5032 stats->objects_per_type[type]++;
5030 stats->size_per_type[type] += obj->Size(); 5033 stats->size_per_type[type] += obj->Size();
5031 } 5034 }
5032 } 5035 }
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
5247 // Configuration is based on the flags new-space-size (really the semispace 5250 // Configuration is based on the flags new-space-size (really the semispace
5248 // size) and old-space-size if set or the initial values of semispace_size_ 5251 // size) and old-space-size if set or the initial values of semispace_size_
5249 // and old_generation_size_ otherwise. 5252 // and old_generation_size_ otherwise.
5250 if (!configured_) { 5253 if (!configured_) {
5251 if (!ConfigureHeapDefault()) return false; 5254 if (!ConfigureHeapDefault()) return false;
5252 } 5255 }
5253 5256
5254 base::CallOnce(&initialize_gc_once, &InitializeGCOnce); 5257 base::CallOnce(&initialize_gc_once, &InitializeGCOnce);
5255 5258
5256 // Set up memory allocator. 5259 // Set up memory allocator.
5257 if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize())) 5260 memory_allocator_ = new MemoryAllocator(isolate_);
5261 if (!memory_allocator_->SetUp(MaxReserved(), MaxExecutableSize(),
5262 code_range_size_))
5258 return false; 5263 return false;
5259 5264
5260 // Initialize incremental marking. 5265 // Initialize incremental marking.
5261 incremental_marking_ = new IncrementalMarking(this); 5266 incremental_marking_ = new IncrementalMarking(this);
5262 5267
5263 // Set up new space. 5268 // Set up new space.
5264 if (!new_space_.SetUp(initial_semispace_size_, max_semi_space_size_)) { 5269 if (!new_space_.SetUp(initial_semispace_size_, max_semi_space_size_)) {
5265 return false; 5270 return false;
5266 } 5271 }
5267 new_space_top_after_last_gc_ = new_space()->top(); 5272 new_space_top_after_last_gc_ = new_space()->top();
5268 5273
5269 // Initialize old space. 5274 // Initialize old space.
5270 old_space_ = new OldSpace(this, OLD_SPACE, NOT_EXECUTABLE); 5275 old_space_ = new OldSpace(this, OLD_SPACE, NOT_EXECUTABLE);
5271 if (old_space_ == NULL) return false; 5276 if (old_space_ == NULL) return false;
5272 if (!old_space_->SetUp()) return false; 5277 if (!old_space_->SetUp()) return false;
5273 5278
5274 if (!isolate_->code_range()->SetUp(code_range_size_)) return false;
5275
5276 // Initialize the code space, set its maximum capacity to the old 5279 // Initialize the code space, set its maximum capacity to the old
5277 // generation size. It needs executable memory. 5280 // generation size. It needs executable memory.
5278 code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE); 5281 code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE);
5279 if (code_space_ == NULL) return false; 5282 if (code_space_ == NULL) return false;
5280 if (!code_space_->SetUp()) return false; 5283 if (!code_space_->SetUp()) return false;
5281 5284
5282 // Initialize map space. 5285 // Initialize map space.
5283 map_space_ = new MapSpace(this, MAP_SPACE); 5286 map_space_ = new MapSpace(this, MAP_SPACE);
5284 if (map_space_ == NULL) return false; 5287 if (map_space_ == NULL) return false;
5285 if (!map_space_->SetUp()) return false; 5288 if (!map_space_->SetUp()) return false;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
5505 } 5508 }
5506 5509
5507 if (lo_space_ != NULL) { 5510 if (lo_space_ != NULL) {
5508 lo_space_->TearDown(); 5511 lo_space_->TearDown();
5509 delete lo_space_; 5512 delete lo_space_;
5510 lo_space_ = NULL; 5513 lo_space_ = NULL;
5511 } 5514 }
5512 5515
5513 store_buffer()->TearDown(); 5516 store_buffer()->TearDown();
5514 5517
5515 isolate_->memory_allocator()->TearDown(); 5518 memory_allocator()->TearDown();
5516 5519
5517 StrongRootsList* next = NULL; 5520 StrongRootsList* next = NULL;
5518 for (StrongRootsList* list = strong_roots_list_; list; list = next) { 5521 for (StrongRootsList* list = strong_roots_list_; list; list = next) {
5519 next = list->next; 5522 next = list->next;
5520 delete list; 5523 delete list;
5521 } 5524 }
5522 strong_roots_list_ = NULL; 5525 strong_roots_list_ = NULL;
5526
5527 delete memory_allocator_;
5528 memory_allocator_ = nullptr;
5523 } 5529 }
5524 5530
5525 5531
5526 void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback, 5532 void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback,
5527 GCType gc_type, bool pass_isolate) { 5533 GCType gc_type, bool pass_isolate) {
5528 DCHECK(callback != NULL); 5534 DCHECK(callback != NULL);
5529 GCCallbackPair pair(callback, gc_type, pass_isolate); 5535 GCCallbackPair pair(callback, gc_type, pass_isolate);
5530 DCHECK(!gc_prologue_callbacks_.Contains(pair)); 5536 DCHECK(!gc_prologue_callbacks_.Contains(pair));
5531 return gc_prologue_callbacks_.Add(pair); 5537 return gc_prologue_callbacks_.Add(pair);
5532 } 5538 }
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
6312 while (concurrent_unmapping_tasks_active_ > 0) { 6318 while (concurrent_unmapping_tasks_active_ > 0) {
6313 pending_unmapping_tasks_semaphore_.Wait(); 6319 pending_unmapping_tasks_semaphore_.Wait();
6314 concurrent_unmapping_tasks_active_--; 6320 concurrent_unmapping_tasks_active_--;
6315 } 6321 }
6316 } 6322 }
6317 6323
6318 6324
6319 void Heap::QueueMemoryChunkForFree(MemoryChunk* chunk) { 6325 void Heap::QueueMemoryChunkForFree(MemoryChunk* chunk) {
6320 // PreFree logically frees the memory chunk. However, the actual freeing 6326 // PreFree logically frees the memory chunk. However, the actual freeing
6321 // will happen on a separate thread sometime later. 6327 // will happen on a separate thread sometime later.
6322 isolate_->memory_allocator()->PreFreeMemory(chunk); 6328 memory_allocator()->PreFreeMemory(chunk);
6323 6329
6324 // The chunks added to this queue will be freed by a concurrent thread. 6330 // The chunks added to this queue will be freed by a concurrent thread.
6325 chunk->set_next_chunk(chunks_queued_for_free_); 6331 chunk->set_next_chunk(chunks_queued_for_free_);
6326 chunks_queued_for_free_ = chunk; 6332 chunks_queued_for_free_ = chunk;
6327 } 6333 }
6328 6334
6329 6335
6330 void Heap::FreeQueuedChunks() { 6336 void Heap::FreeQueuedChunks() {
6331 if (chunks_queued_for_free_ != NULL) { 6337 if (chunks_queued_for_free_ != NULL) {
6332 if (FLAG_concurrent_sweeping) { 6338 if (FLAG_concurrent_sweeping) {
(...skipping 12 matching lines...) Expand all
6345 } 6351 }
6346 concurrent_unmapping_tasks_active_++; 6352 concurrent_unmapping_tasks_active_++;
6347 } 6353 }
6348 6354
6349 6355
6350 void Heap::FreeQueuedChunks(MemoryChunk* list_head) { 6356 void Heap::FreeQueuedChunks(MemoryChunk* list_head) {
6351 MemoryChunk* next; 6357 MemoryChunk* next;
6352 MemoryChunk* chunk; 6358 MemoryChunk* chunk;
6353 for (chunk = list_head; chunk != NULL; chunk = next) { 6359 for (chunk = list_head; chunk != NULL; chunk = next) {
6354 next = chunk->next_chunk(); 6360 next = chunk->next_chunk();
6355 isolate_->memory_allocator()->PerformFreeMemory(chunk); 6361 memory_allocator()->PerformFreeMemory(chunk);
6356 } 6362 }
6357 } 6363 }
6358 6364
6359 6365
6360 void Heap::RememberUnmappedPage(Address page, bool compacted) { 6366 void Heap::RememberUnmappedPage(Address page, bool compacted) {
6361 uintptr_t p = reinterpret_cast<uintptr_t>(page); 6367 uintptr_t p = reinterpret_cast<uintptr_t>(page);
6362 // Tag the page pointer to make it findable in the dump file. 6368 // Tag the page pointer to make it findable in the dump file.
6363 if (compacted) { 6369 if (compacted) {
6364 p ^= 0xc1ead & (Page::kPageSize - 1); // Cleared. 6370 p ^= 0xc1ead & (Page::kPageSize - 1); // Cleared.
6365 } else { 6371 } else {
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
6457 } 6463 }
6458 6464
6459 6465
6460 // static 6466 // static
6461 int Heap::GetStaticVisitorIdForMap(Map* map) { 6467 int Heap::GetStaticVisitorIdForMap(Map* map) {
6462 return StaticVisitorBase::GetVisitorId(map); 6468 return StaticVisitorBase::GetVisitorId(map);
6463 } 6469 }
6464 6470
6465 } // namespace internal 6471 } // namespace internal
6466 } // namespace v8 6472 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698