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

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

Issue 1016803002: Remove PropertyCell space (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 always_allocate_scope_depth_(0), 82 always_allocate_scope_depth_(0),
83 contexts_disposed_(0), 83 contexts_disposed_(0),
84 global_ic_age_(0), 84 global_ic_age_(0),
85 scan_on_scavenge_pages_(0), 85 scan_on_scavenge_pages_(0),
86 new_space_(this), 86 new_space_(this),
87 old_pointer_space_(NULL), 87 old_pointer_space_(NULL),
88 old_data_space_(NULL), 88 old_data_space_(NULL),
89 code_space_(NULL), 89 code_space_(NULL),
90 map_space_(NULL), 90 map_space_(NULL),
91 cell_space_(NULL), 91 cell_space_(NULL),
92 property_cell_space_(NULL),
93 lo_space_(NULL), 92 lo_space_(NULL),
94 gc_state_(NOT_IN_GC), 93 gc_state_(NOT_IN_GC),
95 gc_post_processing_depth_(0), 94 gc_post_processing_depth_(0),
96 allocations_count_(0), 95 allocations_count_(0),
97 raw_allocations_hash_(0), 96 raw_allocations_hash_(0),
98 dump_allocations_hash_countdown_(FLAG_dump_allocations_digest_at_alloc), 97 dump_allocations_hash_countdown_(FLAG_dump_allocations_digest_at_alloc),
99 ms_count_(0), 98 ms_count_(0),
100 gc_count_(0), 99 gc_count_(0),
101 remembered_unmapped_pages_index_(0), 100 remembered_unmapped_pages_index_(0),
102 unflattened_strings_length_(0), 101 unflattened_strings_length_(0),
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 167
169 ClearObjectStats(true); 168 ClearObjectStats(true);
170 } 169 }
171 170
172 171
173 intptr_t Heap::Capacity() { 172 intptr_t Heap::Capacity() {
174 if (!HasBeenSetUp()) return 0; 173 if (!HasBeenSetUp()) return 0;
175 174
176 return new_space_.Capacity() + old_pointer_space_->Capacity() + 175 return new_space_.Capacity() + old_pointer_space_->Capacity() +
177 old_data_space_->Capacity() + code_space_->Capacity() + 176 old_data_space_->Capacity() + code_space_->Capacity() +
178 map_space_->Capacity() + cell_space_->Capacity() + 177 map_space_->Capacity() + cell_space_->Capacity();
179 property_cell_space_->Capacity();
180 } 178 }
181 179
182 180
183 intptr_t Heap::CommittedOldGenerationMemory() { 181 intptr_t Heap::CommittedOldGenerationMemory() {
184 if (!HasBeenSetUp()) return 0; 182 if (!HasBeenSetUp()) return 0;
185 183
186 return old_pointer_space_->CommittedMemory() + 184 return old_pointer_space_->CommittedMemory() +
187 old_data_space_->CommittedMemory() + code_space_->CommittedMemory() + 185 old_data_space_->CommittedMemory() + code_space_->CommittedMemory() +
188 map_space_->CommittedMemory() + cell_space_->CommittedMemory() + 186 map_space_->CommittedMemory() + cell_space_->CommittedMemory() +
189 property_cell_space_->CommittedMemory() + lo_space_->Size(); 187 lo_space_->Size();
190 } 188 }
191 189
192 190
193 intptr_t Heap::CommittedMemory() { 191 intptr_t Heap::CommittedMemory() {
194 if (!HasBeenSetUp()) return 0; 192 if (!HasBeenSetUp()) return 0;
195 193
196 return new_space_.CommittedMemory() + CommittedOldGenerationMemory(); 194 return new_space_.CommittedMemory() + CommittedOldGenerationMemory();
197 } 195 }
198 196
199 197
200 size_t Heap::CommittedPhysicalMemory() { 198 size_t Heap::CommittedPhysicalMemory() {
201 if (!HasBeenSetUp()) return 0; 199 if (!HasBeenSetUp()) return 0;
202 200
203 return new_space_.CommittedPhysicalMemory() + 201 return new_space_.CommittedPhysicalMemory() +
204 old_pointer_space_->CommittedPhysicalMemory() + 202 old_pointer_space_->CommittedPhysicalMemory() +
205 old_data_space_->CommittedPhysicalMemory() + 203 old_data_space_->CommittedPhysicalMemory() +
206 code_space_->CommittedPhysicalMemory() + 204 code_space_->CommittedPhysicalMemory() +
207 map_space_->CommittedPhysicalMemory() + 205 map_space_->CommittedPhysicalMemory() +
208 cell_space_->CommittedPhysicalMemory() + 206 cell_space_->CommittedPhysicalMemory() +
209 property_cell_space_->CommittedPhysicalMemory() +
210 lo_space_->CommittedPhysicalMemory(); 207 lo_space_->CommittedPhysicalMemory();
211 } 208 }
212 209
213 210
214 intptr_t Heap::CommittedMemoryExecutable() { 211 intptr_t Heap::CommittedMemoryExecutable() {
215 if (!HasBeenSetUp()) return 0; 212 if (!HasBeenSetUp()) return 0;
216 213
217 return isolate()->memory_allocator()->SizeExecutable(); 214 return isolate()->memory_allocator()->SizeExecutable();
218 } 215 }
219 216
220 217
221 void Heap::UpdateMaximumCommitted() { 218 void Heap::UpdateMaximumCommitted() {
222 if (!HasBeenSetUp()) return; 219 if (!HasBeenSetUp()) return;
223 220
224 intptr_t current_committed_memory = CommittedMemory(); 221 intptr_t current_committed_memory = CommittedMemory();
225 if (current_committed_memory > maximum_committed_) { 222 if (current_committed_memory > maximum_committed_) {
226 maximum_committed_ = current_committed_memory; 223 maximum_committed_ = current_committed_memory;
227 } 224 }
228 } 225 }
229 226
230 227
231 intptr_t Heap::Available() { 228 intptr_t Heap::Available() {
232 if (!HasBeenSetUp()) return 0; 229 if (!HasBeenSetUp()) return 0;
233 230
234 return new_space_.Available() + old_pointer_space_->Available() + 231 return new_space_.Available() + old_pointer_space_->Available() +
235 old_data_space_->Available() + code_space_->Available() + 232 old_data_space_->Available() + code_space_->Available() +
236 map_space_->Available() + cell_space_->Available() + 233 map_space_->Available() + cell_space_->Available();
237 property_cell_space_->Available();
238 } 234 }
239 235
240 236
241 bool Heap::HasBeenSetUp() { 237 bool Heap::HasBeenSetUp() {
242 return old_pointer_space_ != NULL && old_data_space_ != NULL && 238 return old_pointer_space_ != NULL && old_data_space_ != NULL &&
243 code_space_ != NULL && map_space_ != NULL && cell_space_ != NULL && 239 code_space_ != NULL && map_space_ != NULL && cell_space_ != NULL &&
244 property_cell_space_ != NULL && lo_space_ != NULL; 240 lo_space_ != NULL;
245 } 241 }
246 242
247 243
248 int Heap::GcSafeSizeOfOldObject(HeapObject* object) { 244 int Heap::GcSafeSizeOfOldObject(HeapObject* object) {
249 if (IntrusiveMarking::IsMarked(object)) { 245 if (IntrusiveMarking::IsMarked(object)) {
250 return IntrusiveMarking::SizeOfMarkedObject(object); 246 return IntrusiveMarking::SizeOfMarkedObject(object);
251 } 247 }
252 return object->SizeFromMap(object->map()); 248 return object->SizeFromMap(object->map());
253 } 249 }
254 250
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 ", committed: %6" V8_PTR_PREFIX "d KB\n", 370 ", committed: %6" V8_PTR_PREFIX "d KB\n",
375 map_space_->SizeOfObjects() / KB, map_space_->Available() / KB, 371 map_space_->SizeOfObjects() / KB, map_space_->Available() / KB,
376 map_space_->CommittedMemory() / KB); 372 map_space_->CommittedMemory() / KB);
377 PrintPID("Cell space, used: %6" V8_PTR_PREFIX 373 PrintPID("Cell space, used: %6" V8_PTR_PREFIX
378 "d KB" 374 "d KB"
379 ", available: %6" V8_PTR_PREFIX 375 ", available: %6" V8_PTR_PREFIX
380 "d KB" 376 "d KB"
381 ", committed: %6" V8_PTR_PREFIX "d KB\n", 377 ", committed: %6" V8_PTR_PREFIX "d KB\n",
382 cell_space_->SizeOfObjects() / KB, cell_space_->Available() / KB, 378 cell_space_->SizeOfObjects() / KB, cell_space_->Available() / KB,
383 cell_space_->CommittedMemory() / KB); 379 cell_space_->CommittedMemory() / KB);
384 PrintPID("PropertyCell space, used: %6" V8_PTR_PREFIX
385 "d KB"
386 ", available: %6" V8_PTR_PREFIX
387 "d KB"
388 ", committed: %6" V8_PTR_PREFIX "d KB\n",
389 property_cell_space_->SizeOfObjects() / KB,
390 property_cell_space_->Available() / KB,
391 property_cell_space_->CommittedMemory() / KB);
392 PrintPID("Large object space, used: %6" V8_PTR_PREFIX 380 PrintPID("Large object space, used: %6" V8_PTR_PREFIX
393 "d KB" 381 "d KB"
394 ", available: %6" V8_PTR_PREFIX 382 ", available: %6" V8_PTR_PREFIX
395 "d KB" 383 "d KB"
396 ", committed: %6" V8_PTR_PREFIX "d KB\n", 384 ", committed: %6" V8_PTR_PREFIX "d KB\n",
397 lo_space_->SizeOfObjects() / KB, lo_space_->Available() / KB, 385 lo_space_->SizeOfObjects() / KB, lo_space_->Available() / KB,
398 lo_space_->CommittedMemory() / KB); 386 lo_space_->CommittedMemory() / KB);
399 PrintPID("All spaces, used: %6" V8_PTR_PREFIX 387 PrintPID("All spaces, used: %6" V8_PTR_PREFIX
400 "d KB" 388 "d KB"
401 ", available: %6" V8_PTR_PREFIX 389 ", available: %6" V8_PTR_PREFIX
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 static_cast<int>((old_data_space()->CommittedMemory() * 100.0) / 658 static_cast<int>((old_data_space()->CommittedMemory() * 100.0) /
671 CommittedMemory())); 659 CommittedMemory()));
672 isolate_->counters()->heap_fraction_code_space()->AddSample( 660 isolate_->counters()->heap_fraction_code_space()->AddSample(
673 static_cast<int>((code_space()->CommittedMemory() * 100.0) / 661 static_cast<int>((code_space()->CommittedMemory() * 100.0) /
674 CommittedMemory())); 662 CommittedMemory()));
675 isolate_->counters()->heap_fraction_map_space()->AddSample(static_cast<int>( 663 isolate_->counters()->heap_fraction_map_space()->AddSample(static_cast<int>(
676 (map_space()->CommittedMemory() * 100.0) / CommittedMemory())); 664 (map_space()->CommittedMemory() * 100.0) / CommittedMemory()));
677 isolate_->counters()->heap_fraction_cell_space()->AddSample( 665 isolate_->counters()->heap_fraction_cell_space()->AddSample(
678 static_cast<int>((cell_space()->CommittedMemory() * 100.0) / 666 static_cast<int>((cell_space()->CommittedMemory() * 100.0) /
679 CommittedMemory())); 667 CommittedMemory()));
680 isolate_->counters()->heap_fraction_property_cell_space()->AddSample(
681 static_cast<int>((property_cell_space()->CommittedMemory() * 100.0) /
682 CommittedMemory()));
683 isolate_->counters()->heap_fraction_lo_space()->AddSample(static_cast<int>( 668 isolate_->counters()->heap_fraction_lo_space()->AddSample(static_cast<int>(
684 (lo_space()->CommittedMemory() * 100.0) / CommittedMemory())); 669 (lo_space()->CommittedMemory() * 100.0) / CommittedMemory()));
685 670
686 isolate_->counters()->heap_sample_total_committed()->AddSample( 671 isolate_->counters()->heap_sample_total_committed()->AddSample(
687 static_cast<int>(CommittedMemory() / KB)); 672 static_cast<int>(CommittedMemory() / KB));
688 isolate_->counters()->heap_sample_total_used()->AddSample( 673 isolate_->counters()->heap_sample_total_used()->AddSample(
689 static_cast<int>(SizeOfObjects() / KB)); 674 static_cast<int>(SizeOfObjects() / KB));
690 isolate_->counters()->heap_sample_map_space_committed()->AddSample( 675 isolate_->counters()->heap_sample_map_space_committed()->AddSample(
691 static_cast<int>(map_space()->CommittedMemory() / KB)); 676 static_cast<int>(map_space()->CommittedMemory() / KB));
692 isolate_->counters()->heap_sample_cell_space_committed()->AddSample( 677 isolate_->counters()->heap_sample_cell_space_committed()->AddSample(
693 static_cast<int>(cell_space()->CommittedMemory() / KB)); 678 static_cast<int>(cell_space()->CommittedMemory() / KB));
694 isolate_->counters()
695 ->heap_sample_property_cell_space_committed()
696 ->AddSample(
697 static_cast<int>(property_cell_space()->CommittedMemory() / KB));
698 isolate_->counters()->heap_sample_code_space_committed()->AddSample( 679 isolate_->counters()->heap_sample_code_space_committed()->AddSample(
699 static_cast<int>(code_space()->CommittedMemory() / KB)); 680 static_cast<int>(code_space()->CommittedMemory() / KB));
700 681
701 isolate_->counters()->heap_sample_maximum_committed()->AddSample( 682 isolate_->counters()->heap_sample_maximum_committed()->AddSample(
702 static_cast<int>(MaximumCommittedMemory() / KB)); 683 static_cast<int>(MaximumCommittedMemory() / KB));
703 } 684 }
704 685
705 #define UPDATE_COUNTERS_FOR_SPACE(space) \ 686 #define UPDATE_COUNTERS_FOR_SPACE(space) \
706 isolate_->counters()->space##_bytes_available()->Set( \ 687 isolate_->counters()->space##_bytes_available()->Set( \
707 static_cast<int>(space()->Available())); \ 688 static_cast<int>(space()->Available())); \
(...skipping 11 matching lines...) Expand all
719 #define UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(space) \ 700 #define UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(space) \
720 UPDATE_COUNTERS_FOR_SPACE(space) \ 701 UPDATE_COUNTERS_FOR_SPACE(space) \
721 UPDATE_FRAGMENTATION_FOR_SPACE(space) 702 UPDATE_FRAGMENTATION_FOR_SPACE(space)
722 703
723 UPDATE_COUNTERS_FOR_SPACE(new_space) 704 UPDATE_COUNTERS_FOR_SPACE(new_space)
724 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_pointer_space) 705 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_pointer_space)
725 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_data_space) 706 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_data_space)
726 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(code_space) 707 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(code_space)
727 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(map_space) 708 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(map_space)
728 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(cell_space) 709 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(cell_space)
729 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(property_cell_space)
730 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(lo_space) 710 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(lo_space)
731 #undef UPDATE_COUNTERS_FOR_SPACE 711 #undef UPDATE_COUNTERS_FOR_SPACE
732 #undef UPDATE_FRAGMENTATION_FOR_SPACE 712 #undef UPDATE_FRAGMENTATION_FOR_SPACE
733 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE 713 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE
734 714
735 #ifdef DEBUG 715 #ifdef DEBUG
736 ReportStatisticsAfterGC(); 716 ReportStatisticsAfterGC();
737 #endif // DEBUG 717 #endif // DEBUG
738 718
739 // Remember the last top pointer so that we can later find out 719 // Remember the last top pointer so that we can later find out
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 HeapObjectIterator cell_iterator(cell_space_); 1575 HeapObjectIterator cell_iterator(cell_space_);
1596 for (HeapObject* heap_object = cell_iterator.Next(); heap_object != NULL; 1576 for (HeapObject* heap_object = cell_iterator.Next(); heap_object != NULL;
1597 heap_object = cell_iterator.Next()) { 1577 heap_object = cell_iterator.Next()) {
1598 if (heap_object->IsCell()) { 1578 if (heap_object->IsCell()) {
1599 Cell* cell = Cell::cast(heap_object); 1579 Cell* cell = Cell::cast(heap_object);
1600 Address value_address = cell->ValueAddress(); 1580 Address value_address = cell->ValueAddress();
1601 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); 1581 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address));
1602 } 1582 }
1603 } 1583 }
1604 1584
1605 // Copy objects reachable from global property cells by scavenging global
1606 // property cell values directly.
1607 HeapObjectIterator js_global_property_cell_iterator(property_cell_space_);
1608 for (HeapObject* heap_object = js_global_property_cell_iterator.Next();
1609 heap_object != NULL;
1610 heap_object = js_global_property_cell_iterator.Next()) {
1611 if (heap_object->IsPropertyCell()) {
1612 PropertyCell* cell = PropertyCell::cast(heap_object);
1613 Address value_address = cell->ValueAddress();
1614 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address));
1615 }
1616 }
1617
1618 // Copy objects reachable from the encountered weak collections list. 1585 // Copy objects reachable from the encountered weak collections list.
1619 scavenge_visitor.VisitPointer(&encountered_weak_collections_); 1586 scavenge_visitor.VisitPointer(&encountered_weak_collections_);
1620 // Copy objects reachable from the encountered weak cells. 1587 // Copy objects reachable from the encountered weak cells.
1621 scavenge_visitor.VisitPointer(&encountered_weak_cells_); 1588 scavenge_visitor.VisitPointer(&encountered_weak_cells_);
1622 1589
1623 // Copy objects reachable from the code flushing candidates list. 1590 // Copy objects reachable from the code flushing candidates list.
1624 MarkCompactCollector* collector = mark_compact_collector(); 1591 MarkCompactCollector* collector = mark_compact_collector();
1625 if (collector->is_code_flushing_enabled()) { 1592 if (collector->is_code_flushing_enabled()) {
1626 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); 1593 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor);
1627 } 1594 }
(...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after
2877 return result; 2844 return result;
2878 } 2845 }
2879 2846
2880 2847
2881 AllocationResult Heap::AllocatePropertyCell() { 2848 AllocationResult Heap::AllocatePropertyCell() {
2882 int size = PropertyCell::kSize; 2849 int size = PropertyCell::kSize;
2883 STATIC_ASSERT(PropertyCell::kSize <= Page::kMaxRegularHeapObjectSize); 2850 STATIC_ASSERT(PropertyCell::kSize <= Page::kMaxRegularHeapObjectSize);
2884 2851
2885 HeapObject* result; 2852 HeapObject* result;
2886 AllocationResult allocation = 2853 AllocationResult allocation =
2887 AllocateRaw(size, PROPERTY_CELL_SPACE, PROPERTY_CELL_SPACE); 2854 AllocateRaw(size, OLD_POINTER_SPACE, OLD_POINTER_SPACE);
2888 if (!allocation.To(&result)) return allocation; 2855 if (!allocation.To(&result)) return allocation;
2889 2856
2890 result->set_map_no_write_barrier(global_property_cell_map()); 2857 result->set_map_no_write_barrier(global_property_cell_map());
2891 PropertyCell* cell = PropertyCell::cast(result); 2858 PropertyCell* cell = PropertyCell::cast(result);
2892 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), 2859 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()),
2893 SKIP_WRITE_BARRIER); 2860 SKIP_WRITE_BARRIER);
2894 cell->set_value(the_hole_value()); 2861 cell->set_value(the_hole_value());
2895 return result; 2862 return result;
2896 } 2863 }
2897 2864
(...skipping 1900 matching lines...) Expand 10 before | Expand all | Expand 10 after
4798 PrintF("Old pointer space : "); 4765 PrintF("Old pointer space : ");
4799 old_pointer_space_->ReportStatistics(); 4766 old_pointer_space_->ReportStatistics();
4800 PrintF("Old data space : "); 4767 PrintF("Old data space : ");
4801 old_data_space_->ReportStatistics(); 4768 old_data_space_->ReportStatistics();
4802 PrintF("Code space : "); 4769 PrintF("Code space : ");
4803 code_space_->ReportStatistics(); 4770 code_space_->ReportStatistics();
4804 PrintF("Map space : "); 4771 PrintF("Map space : ");
4805 map_space_->ReportStatistics(); 4772 map_space_->ReportStatistics();
4806 PrintF("Cell space : "); 4773 PrintF("Cell space : ");
4807 cell_space_->ReportStatistics(); 4774 cell_space_->ReportStatistics();
4808 PrintF("PropertyCell space : ");
4809 property_cell_space_->ReportStatistics();
4810 PrintF("Large object space : "); 4775 PrintF("Large object space : ");
4811 lo_space_->ReportStatistics(); 4776 lo_space_->ReportStatistics();
4812 PrintF(">>>>>> ========================================= >>>>>>\n"); 4777 PrintF(">>>>>> ========================================= >>>>>>\n");
4813 } 4778 }
4814 4779
4815 #endif // DEBUG 4780 #endif // DEBUG
4816 4781
4817 bool Heap::Contains(HeapObject* value) { return Contains(value->address()); } 4782 bool Heap::Contains(HeapObject* value) { return Contains(value->address()); }
4818 4783
4819 4784
4820 bool Heap::Contains(Address addr) { 4785 bool Heap::Contains(Address addr) {
4821 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 4786 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false;
4822 return HasBeenSetUp() && 4787 return HasBeenSetUp() &&
4823 (new_space_.ToSpaceContains(addr) || 4788 (new_space_.ToSpaceContains(addr) ||
4824 old_pointer_space_->Contains(addr) || 4789 old_pointer_space_->Contains(addr) ||
4825 old_data_space_->Contains(addr) || code_space_->Contains(addr) || 4790 old_data_space_->Contains(addr) || code_space_->Contains(addr) ||
4826 map_space_->Contains(addr) || cell_space_->Contains(addr) || 4791 map_space_->Contains(addr) || cell_space_->Contains(addr) ||
4827 property_cell_space_->Contains(addr) ||
4828 lo_space_->SlowContains(addr)); 4792 lo_space_->SlowContains(addr));
4829 } 4793 }
4830 4794
4831 4795
4832 bool Heap::InSpace(HeapObject* value, AllocationSpace space) { 4796 bool Heap::InSpace(HeapObject* value, AllocationSpace space) {
4833 return InSpace(value->address(), space); 4797 return InSpace(value->address(), space);
4834 } 4798 }
4835 4799
4836 4800
4837 bool Heap::InSpace(Address addr, AllocationSpace space) { 4801 bool Heap::InSpace(Address addr, AllocationSpace space) {
4838 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 4802 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false;
4839 if (!HasBeenSetUp()) return false; 4803 if (!HasBeenSetUp()) return false;
4840 4804
4841 switch (space) { 4805 switch (space) {
4842 case NEW_SPACE: 4806 case NEW_SPACE:
4843 return new_space_.ToSpaceContains(addr); 4807 return new_space_.ToSpaceContains(addr);
4844 case OLD_POINTER_SPACE: 4808 case OLD_POINTER_SPACE:
4845 return old_pointer_space_->Contains(addr); 4809 return old_pointer_space_->Contains(addr);
4846 case OLD_DATA_SPACE: 4810 case OLD_DATA_SPACE:
4847 return old_data_space_->Contains(addr); 4811 return old_data_space_->Contains(addr);
4848 case CODE_SPACE: 4812 case CODE_SPACE:
4849 return code_space_->Contains(addr); 4813 return code_space_->Contains(addr);
4850 case MAP_SPACE: 4814 case MAP_SPACE:
4851 return map_space_->Contains(addr); 4815 return map_space_->Contains(addr);
4852 case CELL_SPACE: 4816 case CELL_SPACE:
4853 return cell_space_->Contains(addr); 4817 return cell_space_->Contains(addr);
4854 case PROPERTY_CELL_SPACE:
4855 return property_cell_space_->Contains(addr);
4856 case LO_SPACE: 4818 case LO_SPACE:
4857 return lo_space_->SlowContains(addr); 4819 return lo_space_->SlowContains(addr);
4858 } 4820 }
4859 UNREACHABLE(); 4821 UNREACHABLE();
4860 return false; 4822 return false;
4861 } 4823 }
4862 4824
4863 4825
4864 bool Heap::RootIsImmortalImmovable(int root_index) { 4826 bool Heap::RootIsImmortalImmovable(int root_index) {
4865 switch (root_index) { 4827 switch (root_index) {
(...skipping 28 matching lines...) Expand all
4894 4856
4895 new_space_.Verify(); 4857 new_space_.Verify();
4896 4858
4897 old_pointer_space_->Verify(&visitor); 4859 old_pointer_space_->Verify(&visitor);
4898 map_space_->Verify(&visitor); 4860 map_space_->Verify(&visitor);
4899 4861
4900 VerifyPointersVisitor no_dirty_regions_visitor; 4862 VerifyPointersVisitor no_dirty_regions_visitor;
4901 old_data_space_->Verify(&no_dirty_regions_visitor); 4863 old_data_space_->Verify(&no_dirty_regions_visitor);
4902 code_space_->Verify(&no_dirty_regions_visitor); 4864 code_space_->Verify(&no_dirty_regions_visitor);
4903 cell_space_->Verify(&no_dirty_regions_visitor); 4865 cell_space_->Verify(&no_dirty_regions_visitor);
4904 property_cell_space_->Verify(&no_dirty_regions_visitor);
4905 4866
4906 lo_space_->Verify(); 4867 lo_space_->Verify();
4907 } 4868 }
4908 #endif 4869 #endif
4909 4870
4910 4871
4911 void Heap::ZapFromSpace() { 4872 void Heap::ZapFromSpace() {
4912 NewSpacePageIterator it(new_space_.FromSpaceStart(), 4873 NewSpacePageIterator it(new_space_.FromSpaceStart(),
4913 new_space_.FromSpaceEnd()); 4874 new_space_.FromSpaceEnd());
4914 while (it.has_next()) { 4875 while (it.has_next()) {
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
5219 *stats->old_pointer_space_size = old_pointer_space_->SizeOfObjects(); 5180 *stats->old_pointer_space_size = old_pointer_space_->SizeOfObjects();
5220 *stats->old_pointer_space_capacity = old_pointer_space_->Capacity(); 5181 *stats->old_pointer_space_capacity = old_pointer_space_->Capacity();
5221 *stats->old_data_space_size = old_data_space_->SizeOfObjects(); 5182 *stats->old_data_space_size = old_data_space_->SizeOfObjects();
5222 *stats->old_data_space_capacity = old_data_space_->Capacity(); 5183 *stats->old_data_space_capacity = old_data_space_->Capacity();
5223 *stats->code_space_size = code_space_->SizeOfObjects(); 5184 *stats->code_space_size = code_space_->SizeOfObjects();
5224 *stats->code_space_capacity = code_space_->Capacity(); 5185 *stats->code_space_capacity = code_space_->Capacity();
5225 *stats->map_space_size = map_space_->SizeOfObjects(); 5186 *stats->map_space_size = map_space_->SizeOfObjects();
5226 *stats->map_space_capacity = map_space_->Capacity(); 5187 *stats->map_space_capacity = map_space_->Capacity();
5227 *stats->cell_space_size = cell_space_->SizeOfObjects(); 5188 *stats->cell_space_size = cell_space_->SizeOfObjects();
5228 *stats->cell_space_capacity = cell_space_->Capacity(); 5189 *stats->cell_space_capacity = cell_space_->Capacity();
5229 *stats->property_cell_space_size = property_cell_space_->SizeOfObjects();
5230 *stats->property_cell_space_capacity = property_cell_space_->Capacity();
5231 *stats->lo_space_size = lo_space_->Size(); 5190 *stats->lo_space_size = lo_space_->Size();
5232 isolate_->global_handles()->RecordStats(stats); 5191 isolate_->global_handles()->RecordStats(stats);
5233 *stats->memory_allocator_size = isolate()->memory_allocator()->Size(); 5192 *stats->memory_allocator_size = isolate()->memory_allocator()->Size();
5234 *stats->memory_allocator_capacity = 5193 *stats->memory_allocator_capacity =
5235 isolate()->memory_allocator()->Size() + 5194 isolate()->memory_allocator()->Size() +
5236 isolate()->memory_allocator()->Available(); 5195 isolate()->memory_allocator()->Available();
5237 *stats->os_error = base::OS::GetLastError(); 5196 *stats->os_error = base::OS::GetLastError();
5238 isolate()->memory_allocator()->Available(); 5197 isolate()->memory_allocator()->Available();
5239 if (take_snapshot) { 5198 if (take_snapshot) {
5240 HeapIterator iterator(this); 5199 HeapIterator iterator(this);
5241 for (HeapObject* obj = iterator.next(); obj != NULL; 5200 for (HeapObject* obj = iterator.next(); obj != NULL;
5242 obj = iterator.next()) { 5201 obj = iterator.next()) {
5243 InstanceType type = obj->map()->instance_type(); 5202 InstanceType type = obj->map()->instance_type();
5244 DCHECK(0 <= type && type <= LAST_TYPE); 5203 DCHECK(0 <= type && type <= LAST_TYPE);
5245 stats->objects_per_type[type]++; 5204 stats->objects_per_type[type]++;
5246 stats->size_per_type[type] += obj->Size(); 5205 stats->size_per_type[type] += obj->Size();
5247 } 5206 }
5248 } 5207 }
5249 } 5208 }
5250 5209
5251 5210
5252 intptr_t Heap::PromotedSpaceSizeOfObjects() { 5211 intptr_t Heap::PromotedSpaceSizeOfObjects() {
5253 return old_pointer_space_->SizeOfObjects() + 5212 return old_pointer_space_->SizeOfObjects() +
5254 old_data_space_->SizeOfObjects() + code_space_->SizeOfObjects() + 5213 old_data_space_->SizeOfObjects() + code_space_->SizeOfObjects() +
5255 map_space_->SizeOfObjects() + cell_space_->SizeOfObjects() + 5214 map_space_->SizeOfObjects() + cell_space_->SizeOfObjects() +
5256 property_cell_space_->SizeOfObjects() + lo_space_->SizeOfObjects(); 5215 lo_space_->SizeOfObjects();
5257 } 5216 }
5258 5217
5259 5218
5260 int64_t Heap::PromotedExternalMemorySize() { 5219 int64_t Heap::PromotedExternalMemorySize() {
5261 if (amount_of_external_allocated_memory_ <= 5220 if (amount_of_external_allocated_memory_ <=
5262 amount_of_external_allocated_memory_at_last_global_gc_) 5221 amount_of_external_allocated_memory_at_last_global_gc_)
5263 return 0; 5222 return 0;
5264 return amount_of_external_allocated_memory_ - 5223 return amount_of_external_allocated_memory_ -
5265 amount_of_external_allocated_memory_at_last_global_gc_; 5224 amount_of_external_allocated_memory_at_last_global_gc_;
5266 } 5225 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
5399 // Initialize map space. 5358 // Initialize map space.
5400 map_space_ = new MapSpace(this, max_old_generation_size_, MAP_SPACE); 5359 map_space_ = new MapSpace(this, max_old_generation_size_, MAP_SPACE);
5401 if (map_space_ == NULL) return false; 5360 if (map_space_ == NULL) return false;
5402 if (!map_space_->SetUp()) return false; 5361 if (!map_space_->SetUp()) return false;
5403 5362
5404 // Initialize simple cell space. 5363 // Initialize simple cell space.
5405 cell_space_ = new CellSpace(this, max_old_generation_size_, CELL_SPACE); 5364 cell_space_ = new CellSpace(this, max_old_generation_size_, CELL_SPACE);
5406 if (cell_space_ == NULL) return false; 5365 if (cell_space_ == NULL) return false;
5407 if (!cell_space_->SetUp()) return false; 5366 if (!cell_space_->SetUp()) return false;
5408 5367
5409 // Initialize global property cell space.
5410 property_cell_space_ = new PropertyCellSpace(this, max_old_generation_size_,
5411 PROPERTY_CELL_SPACE);
5412 if (property_cell_space_ == NULL) return false;
5413 if (!property_cell_space_->SetUp()) return false;
5414
5415 // The large object code space may contain code or data. We set the memory 5368 // The large object code space may contain code or data. We set the memory
5416 // to be non-executable here for safety, but this means we need to enable it 5369 // to be non-executable here for safety, but this means we need to enable it
5417 // explicitly when allocating large code objects. 5370 // explicitly when allocating large code objects.
5418 lo_space_ = new LargeObjectSpace(this, max_old_generation_size_, LO_SPACE); 5371 lo_space_ = new LargeObjectSpace(this, max_old_generation_size_, LO_SPACE);
5419 if (lo_space_ == NULL) return false; 5372 if (lo_space_ == NULL) return false;
5420 if (!lo_space_->SetUp()) return false; 5373 if (!lo_space_->SetUp()) return false;
5421 5374
5422 // Set up the seed that is used to randomize the string hash function. 5375 // Set up the seed that is used to randomize the string hash function.
5423 DCHECK(hash_seed() == 0); 5376 DCHECK(hash_seed() == 0);
5424 if (FLAG_randomize_hashes) { 5377 if (FLAG_randomize_hashes) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
5519 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ", 5472 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
5520 old_pointer_space_->MaximumCommittedMemory()); 5473 old_pointer_space_->MaximumCommittedMemory());
5521 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ", 5474 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
5522 old_pointer_space_->MaximumCommittedMemory()); 5475 old_pointer_space_->MaximumCommittedMemory());
5523 PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ", 5476 PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ",
5524 code_space_->MaximumCommittedMemory()); 5477 code_space_->MaximumCommittedMemory());
5525 PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ", 5478 PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ",
5526 map_space_->MaximumCommittedMemory()); 5479 map_space_->MaximumCommittedMemory());
5527 PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ", 5480 PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ",
5528 cell_space_->MaximumCommittedMemory()); 5481 cell_space_->MaximumCommittedMemory());
5529 PrintF("maximum_committed_by_property_space=%" V8_PTR_PREFIX "d ",
5530 property_cell_space_->MaximumCommittedMemory());
5531 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", 5482 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ",
5532 lo_space_->MaximumCommittedMemory()); 5483 lo_space_->MaximumCommittedMemory());
5533 PrintF("\n\n"); 5484 PrintF("\n\n");
5534 } 5485 }
5535 5486
5536 if (FLAG_verify_predictable) { 5487 if (FLAG_verify_predictable) {
5537 PrintAlloctionsHash(); 5488 PrintAlloctionsHash();
5538 } 5489 }
5539 5490
5540 TearDownArrayBuffers(); 5491 TearDownArrayBuffers();
(...skipping 29 matching lines...) Expand all
5570 delete map_space_; 5521 delete map_space_;
5571 map_space_ = NULL; 5522 map_space_ = NULL;
5572 } 5523 }
5573 5524
5574 if (cell_space_ != NULL) { 5525 if (cell_space_ != NULL) {
5575 cell_space_->TearDown(); 5526 cell_space_->TearDown();
5576 delete cell_space_; 5527 delete cell_space_;
5577 cell_space_ = NULL; 5528 cell_space_ = NULL;
5578 } 5529 }
5579 5530
5580 if (property_cell_space_ != NULL) {
5581 property_cell_space_->TearDown();
5582 delete property_cell_space_;
5583 property_cell_space_ = NULL;
5584 }
5585
5586 if (lo_space_ != NULL) { 5531 if (lo_space_ != NULL) {
5587 lo_space_->TearDown(); 5532 lo_space_->TearDown();
5588 delete lo_space_; 5533 delete lo_space_;
5589 lo_space_ = NULL; 5534 lo_space_ = NULL;
5590 } 5535 }
5591 5536
5592 store_buffer()->TearDown(); 5537 store_buffer()->TearDown();
5593 5538
5594 isolate_->memory_allocator()->TearDown(); 5539 isolate_->memory_allocator()->TearDown();
5595 } 5540 }
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
5701 case OLD_POINTER_SPACE: 5646 case OLD_POINTER_SPACE:
5702 return heap_->old_pointer_space(); 5647 return heap_->old_pointer_space();
5703 case OLD_DATA_SPACE: 5648 case OLD_DATA_SPACE:
5704 return heap_->old_data_space(); 5649 return heap_->old_data_space();
5705 case CODE_SPACE: 5650 case CODE_SPACE:
5706 return heap_->code_space(); 5651 return heap_->code_space();
5707 case MAP_SPACE: 5652 case MAP_SPACE:
5708 return heap_->map_space(); 5653 return heap_->map_space();
5709 case CELL_SPACE: 5654 case CELL_SPACE:
5710 return heap_->cell_space(); 5655 return heap_->cell_space();
5711 case PROPERTY_CELL_SPACE:
5712 return heap_->property_cell_space();
5713 case LO_SPACE: 5656 case LO_SPACE:
5714 return heap_->lo_space(); 5657 return heap_->lo_space();
5715 default: 5658 default:
5716 return NULL; 5659 return NULL;
5717 } 5660 }
5718 } 5661 }
5719 5662
5720 5663
5721 PagedSpace* PagedSpaces::next() { 5664 PagedSpace* PagedSpaces::next() {
5722 switch (counter_++) { 5665 switch (counter_++) {
5723 case OLD_POINTER_SPACE: 5666 case OLD_POINTER_SPACE:
5724 return heap_->old_pointer_space(); 5667 return heap_->old_pointer_space();
5725 case OLD_DATA_SPACE: 5668 case OLD_DATA_SPACE:
5726 return heap_->old_data_space(); 5669 return heap_->old_data_space();
5727 case CODE_SPACE: 5670 case CODE_SPACE:
5728 return heap_->code_space(); 5671 return heap_->code_space();
5729 case MAP_SPACE: 5672 case MAP_SPACE:
5730 return heap_->map_space(); 5673 return heap_->map_space();
5731 case CELL_SPACE: 5674 case CELL_SPACE:
5732 return heap_->cell_space(); 5675 return heap_->cell_space();
5733 case PROPERTY_CELL_SPACE:
5734 return heap_->property_cell_space();
5735 default: 5676 default:
5736 return NULL; 5677 return NULL;
5737 } 5678 }
5738 } 5679 }
5739 5680
5740 5681
5741 OldSpace* OldSpaces::next() { 5682 OldSpace* OldSpaces::next() {
5742 switch (counter_++) { 5683 switch (counter_++) {
5743 case OLD_POINTER_SPACE: 5684 case OLD_POINTER_SPACE:
5744 return heap_->old_pointer_space(); 5685 return heap_->old_pointer_space();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
5811 break; 5752 break;
5812 case CODE_SPACE: 5753 case CODE_SPACE:
5813 iterator_ = new HeapObjectIterator(heap_->code_space(), size_func_); 5754 iterator_ = new HeapObjectIterator(heap_->code_space(), size_func_);
5814 break; 5755 break;
5815 case MAP_SPACE: 5756 case MAP_SPACE:
5816 iterator_ = new HeapObjectIterator(heap_->map_space(), size_func_); 5757 iterator_ = new HeapObjectIterator(heap_->map_space(), size_func_);
5817 break; 5758 break;
5818 case CELL_SPACE: 5759 case CELL_SPACE:
5819 iterator_ = new HeapObjectIterator(heap_->cell_space(), size_func_); 5760 iterator_ = new HeapObjectIterator(heap_->cell_space(), size_func_);
5820 break; 5761 break;
5821 case PROPERTY_CELL_SPACE:
5822 iterator_ =
5823 new HeapObjectIterator(heap_->property_cell_space(), size_func_);
5824 break;
5825 case LO_SPACE: 5762 case LO_SPACE:
5826 iterator_ = new LargeObjectIterator(heap_->lo_space(), size_func_); 5763 iterator_ = new LargeObjectIterator(heap_->lo_space(), size_func_);
5827 break; 5764 break;
5828 } 5765 }
5829 5766
5830 // Return the newly allocated iterator; 5767 // Return the newly allocated iterator;
5831 DCHECK(iterator_ != NULL); 5768 DCHECK(iterator_ != NULL);
5832 return iterator_; 5769 return iterator_;
5833 } 5770 }
5834 5771
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
6446 static_cast<int>(object_sizes_last_time_[index])); 6383 static_cast<int>(object_sizes_last_time_[index]));
6447 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6384 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6448 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6385 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6449 6386
6450 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6387 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6451 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6388 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6452 ClearObjectStats(); 6389 ClearObjectStats();
6453 } 6390 }
6454 } 6391 }
6455 } // namespace v8::internal 6392 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | src/objects-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698