OLD | NEW |
---|---|
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 #ifndef V8_HEAP_HEAP_H_ | 5 #ifndef V8_HEAP_HEAP_H_ |
6 #define V8_HEAP_HEAP_H_ | 6 #define V8_HEAP_HEAP_H_ |
7 | 7 |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
634 intptr_t SizeOfObjects(); | 634 intptr_t SizeOfObjects(); |
635 | 635 |
636 // Return the starting address and a mask for the new space. And-masking an | 636 // Return the starting address and a mask for the new space. And-masking an |
637 // address with the mask will result in the start address of the new space | 637 // address with the mask will result in the start address of the new space |
638 // for all addresses in either semispace. | 638 // for all addresses in either semispace. |
639 Address NewSpaceStart() { return new_space_.start(); } | 639 Address NewSpaceStart() { return new_space_.start(); } |
640 uintptr_t NewSpaceMask() { return new_space_.mask(); } | 640 uintptr_t NewSpaceMask() { return new_space_.mask(); } |
641 Address NewSpaceTop() { return new_space_.top(); } | 641 Address NewSpaceTop() { return new_space_.top(); } |
642 | 642 |
643 NewSpace* new_space() { return &new_space_; } | 643 NewSpace* new_space() { return &new_space_; } |
644 OldSpace* old_pointer_space() { return old_pointer_space_; } | 644 OldSpace* old_space() { return old_space_; } |
645 OldSpace* old_data_space() { return old_data_space_; } | |
646 OldSpace* code_space() { return code_space_; } | 645 OldSpace* code_space() { return code_space_; } |
647 MapSpace* map_space() { return map_space_; } | 646 MapSpace* map_space() { return map_space_; } |
648 CellSpace* cell_space() { return cell_space_; } | 647 CellSpace* cell_space() { return cell_space_; } |
649 PropertyCellSpace* property_cell_space() { return property_cell_space_; } | 648 PropertyCellSpace* property_cell_space() { return property_cell_space_; } |
650 LargeObjectSpace* lo_space() { return lo_space_; } | 649 LargeObjectSpace* lo_space() { return lo_space_; } |
651 PagedSpace* paged_space(int idx) { | 650 PagedSpace* paged_space(int idx) { |
652 switch (idx) { | 651 switch (idx) { |
653 case OLD_POINTER_SPACE: | 652 case OLD_SPACE: |
654 return old_pointer_space(); | 653 return old_space(); |
655 case OLD_DATA_SPACE: | |
656 return old_data_space(); | |
657 case MAP_SPACE: | 654 case MAP_SPACE: |
658 return map_space(); | 655 return map_space(); |
659 case CELL_SPACE: | 656 case CELL_SPACE: |
660 return cell_space(); | 657 return cell_space(); |
661 case PROPERTY_CELL_SPACE: | 658 case PROPERTY_CELL_SPACE: |
662 return property_cell_space(); | 659 return property_cell_space(); |
663 case CODE_SPACE: | 660 case CODE_SPACE: |
664 return code_space(); | 661 return code_space(); |
665 case NEW_SPACE: | 662 case NEW_SPACE: |
666 case LO_SPACE: | 663 case LO_SPACE: |
667 UNREACHABLE(); | 664 UNREACHABLE(); |
668 } | 665 } |
669 return NULL; | 666 return NULL; |
670 } | 667 } |
671 | 668 |
672 bool always_allocate() { return always_allocate_scope_depth_ != 0; } | 669 bool always_allocate() { return always_allocate_scope_depth_ != 0; } |
673 Address always_allocate_scope_depth_address() { | 670 Address always_allocate_scope_depth_address() { |
674 return reinterpret_cast<Address>(&always_allocate_scope_depth_); | 671 return reinterpret_cast<Address>(&always_allocate_scope_depth_); |
675 } | 672 } |
676 | 673 |
677 Address* NewSpaceAllocationTopAddress() { | 674 Address* NewSpaceAllocationTopAddress() { |
678 return new_space_.allocation_top_address(); | 675 return new_space_.allocation_top_address(); |
679 } | 676 } |
680 Address* NewSpaceAllocationLimitAddress() { | 677 Address* NewSpaceAllocationLimitAddress() { |
681 return new_space_.allocation_limit_address(); | 678 return new_space_.allocation_limit_address(); |
682 } | 679 } |
683 | 680 |
684 Address* OldPointerSpaceAllocationTopAddress() { | 681 Address* OldSpaceAllocationTopAddress() { |
685 return old_pointer_space_->allocation_top_address(); | 682 return old_space_->allocation_top_address(); |
686 } | 683 } |
687 Address* OldPointerSpaceAllocationLimitAddress() { | 684 Address* OldSpaceAllocationLimitAddress() { |
688 return old_pointer_space_->allocation_limit_address(); | 685 return old_space_->allocation_limit_address(); |
689 } | |
690 | |
691 Address* OldDataSpaceAllocationTopAddress() { | |
692 return old_data_space_->allocation_top_address(); | |
693 } | |
694 Address* OldDataSpaceAllocationLimitAddress() { | |
695 return old_data_space_->allocation_limit_address(); | |
696 } | 686 } |
697 | 687 |
698 // TODO(hpayer): There is still a missmatch between capacity and actual | 688 // TODO(hpayer): There is still a missmatch between capacity and actual |
699 // committed memory size. | 689 // committed memory size. |
700 bool CanExpandOldGeneration(int size) { | 690 bool CanExpandOldGeneration(int size) { |
701 return (CommittedOldGenerationMemory() + size) < MaxOldGenerationSize(); | 691 return (CommittedOldGenerationMemory() + size) < MaxOldGenerationSize(); |
702 } | 692 } |
703 | 693 |
704 // Returns a deep copy of the JavaScript object. | 694 // Returns a deep copy of the JavaScript object. |
705 // Properties and elements are copied too. | 695 // Properties and elements are copied too. |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
915 void IterateAndMarkPointersToFromSpace(Address start, Address end, | 905 void IterateAndMarkPointersToFromSpace(Address start, Address end, |
916 ObjectSlotCallback callback); | 906 ObjectSlotCallback callback); |
917 | 907 |
918 // Returns whether the object resides in new space. | 908 // Returns whether the object resides in new space. |
919 inline bool InNewSpace(Object* object); | 909 inline bool InNewSpace(Object* object); |
920 inline bool InNewSpace(Address address); | 910 inline bool InNewSpace(Address address); |
921 inline bool InNewSpacePage(Address address); | 911 inline bool InNewSpacePage(Address address); |
922 inline bool InFromSpace(Object* object); | 912 inline bool InFromSpace(Object* object); |
923 inline bool InToSpace(Object* object); | 913 inline bool InToSpace(Object* object); |
924 | 914 |
925 // Returns whether the object resides in old pointer space. | 915 // Returns whether the object resides in old space. |
926 inline bool InOldPointerSpace(Address address); | 916 inline bool InOldSpace(Address address); |
927 inline bool InOldPointerSpace(Object* object); | 917 inline bool InOldSpace(Object* object); |
928 | |
929 // Returns whether the object resides in old data space. | |
930 inline bool InOldDataSpace(Address address); | |
931 inline bool InOldDataSpace(Object* object); | |
932 | 918 |
933 // Checks whether an address/object in the heap (including auxiliary | 919 // Checks whether an address/object in the heap (including auxiliary |
934 // area and unused area). | 920 // area and unused area). |
935 bool Contains(Address addr); | 921 bool Contains(Address addr); |
936 bool Contains(HeapObject* value); | 922 bool Contains(HeapObject* value); |
937 | 923 |
938 // Checks whether an address/object in a space. | 924 // Checks whether an address/object in a space. |
939 // Currently used by tests, serialization and heap verification only. | 925 // Currently used by tests, serialization and heap verification only. |
940 bool InSpace(Address addr, AllocationSpace space); | 926 bool InSpace(Address addr, AllocationSpace space); |
941 bool InSpace(HeapObject* value, AllocationSpace space); | 927 bool InSpace(HeapObject* value, AllocationSpace space); |
942 | 928 |
943 // Finds out which space an object should get promoted to based on its type. | |
944 inline OldSpace* TargetSpace(HeapObject* object); | |
945 static inline AllocationSpace TargetSpaceId(InstanceType type); | |
946 | |
947 // Checks whether the given object is allowed to be migrated from it's | 929 // Checks whether the given object is allowed to be migrated from it's |
948 // current space into the given destination space. Used for debugging. | 930 // current space into the given destination space. Used for debugging. |
949 inline bool AllowedToBeMigrated(HeapObject* object, AllocationSpace dest); | 931 inline bool AllowedToBeMigrated(HeapObject* object, AllocationSpace dest); |
950 | 932 |
951 // Sets the stub_cache_ (only used when expanding the dictionary). | 933 // Sets the stub_cache_ (only used when expanding the dictionary). |
952 void public_set_code_stubs(UnseededNumberDictionary* value) { | 934 void public_set_code_stubs(UnseededNumberDictionary* value) { |
953 roots_[kCodeStubsRootIndex] = value; | 935 roots_[kCodeStubsRootIndex] = value; |
954 } | 936 } |
955 | 937 |
956 // Support for computing object sizes for old objects during GCs. Returns | 938 // Support for computing object sizes for old objects during GCs. Returns |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1573 int always_allocate_scope_depth_; | 1555 int always_allocate_scope_depth_; |
1574 | 1556 |
1575 // For keeping track of context disposals. | 1557 // For keeping track of context disposals. |
1576 int contexts_disposed_; | 1558 int contexts_disposed_; |
1577 | 1559 |
1578 int global_ic_age_; | 1560 int global_ic_age_; |
1579 | 1561 |
1580 int scan_on_scavenge_pages_; | 1562 int scan_on_scavenge_pages_; |
1581 | 1563 |
1582 NewSpace new_space_; | 1564 NewSpace new_space_; |
1583 OldSpace* old_pointer_space_; | 1565 OldSpace* old_space_; |
1584 OldSpace* old_data_space_; | |
1585 OldSpace* code_space_; | 1566 OldSpace* code_space_; |
1586 MapSpace* map_space_; | 1567 MapSpace* map_space_; |
1587 CellSpace* cell_space_; | 1568 CellSpace* cell_space_; |
1588 PropertyCellSpace* property_cell_space_; | 1569 PropertyCellSpace* property_cell_space_; |
1589 LargeObjectSpace* lo_space_; | 1570 LargeObjectSpace* lo_space_; |
1590 HeapState gc_state_; | 1571 HeapState gc_state_; |
1591 int gc_post_processing_depth_; | 1572 int gc_post_processing_depth_; |
1592 Address new_space_top_after_last_gc_; | 1573 Address new_space_top_after_last_gc_; |
1593 | 1574 |
1594 // Returns the amount of external memory registered since last global gc. | 1575 // Returns the amount of external memory registered since last global gc. |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1770 // Performs garbage collection | 1751 // Performs garbage collection |
1771 // Returns whether there is a chance another major GC could | 1752 // Returns whether there is a chance another major GC could |
1772 // collect more garbage. | 1753 // collect more garbage. |
1773 bool PerformGarbageCollection( | 1754 bool PerformGarbageCollection( |
1774 GarbageCollector collector, | 1755 GarbageCollector collector, |
1775 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1756 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
1776 | 1757 |
1777 inline void UpdateOldSpaceLimits(); | 1758 inline void UpdateOldSpaceLimits(); |
1778 | 1759 |
1779 // Selects the proper allocation space depending on the given object | 1760 // Selects the proper allocation space depending on the given object |
1780 // size, pretenuring decision, and preferred old-space. | 1761 // size and pretenuring decision. |
1781 static AllocationSpace SelectSpace(int object_size, | 1762 static AllocationSpace SelectSpace(int object_size, |
Hannes Payer (out of office)
2015/03/18 07:33:49
I think we can get rid of SelectSpace and integrat
| |
1782 AllocationSpace preferred_old_space, | |
1783 PretenureFlag pretenure) { | 1763 PretenureFlag pretenure) { |
1784 DCHECK(preferred_old_space == OLD_POINTER_SPACE || | |
1785 preferred_old_space == OLD_DATA_SPACE); | |
1786 if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE; | 1764 if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE; |
1787 return (pretenure == TENURED) ? preferred_old_space : NEW_SPACE; | 1765 return (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE; |
1788 } | 1766 } |
1789 | 1767 |
1790 HeapObject* DoubleAlignForDeserialization(HeapObject* object, int size); | 1768 HeapObject* DoubleAlignForDeserialization(HeapObject* object, int size); |
1791 | 1769 |
1792 // Allocate an uninitialized object. The memory is non-executable if the | 1770 // Allocate an uninitialized object. The memory is non-executable if the |
1793 // hardware and OS allow. This is the single choke-point for allocations | 1771 // hardware and OS allow. This is the single choke-point for allocations |
1794 // performed by the runtime and should not be bypassed (to extend this to | 1772 // performed by the runtime and should not be bypassed (to extend this to |
1795 // inlined allocations, use the Heap::DisableInlineAllocation() support). | 1773 // inlined allocations, use the Heap::DisableInlineAllocation() support). |
1796 MUST_USE_RESULT inline AllocationResult AllocateRaw( | 1774 MUST_USE_RESULT inline AllocationResult AllocateRaw( |
1797 int size_in_bytes, AllocationSpace space, AllocationSpace retry_space); | 1775 int size_in_bytes, AllocationSpace space, AllocationSpace retry_space); |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2180 | 2158 |
2181 | 2159 |
2182 class HeapStats { | 2160 class HeapStats { |
2183 public: | 2161 public: |
2184 static const int kStartMarker = 0xDECADE00; | 2162 static const int kStartMarker = 0xDECADE00; |
2185 static const int kEndMarker = 0xDECADE01; | 2163 static const int kEndMarker = 0xDECADE01; |
2186 | 2164 |
2187 int* start_marker; // 0 | 2165 int* start_marker; // 0 |
2188 int* new_space_size; // 1 | 2166 int* new_space_size; // 1 |
2189 int* new_space_capacity; // 2 | 2167 int* new_space_capacity; // 2 |
2190 intptr_t* old_pointer_space_size; // 3 | 2168 intptr_t* old_space_size; // 3 |
2191 intptr_t* old_pointer_space_capacity; // 4 | 2169 intptr_t* old_space_capacity; // 4 |
2192 intptr_t* old_data_space_size; // 5 | 2170 intptr_t* code_space_size; // 5 |
2193 intptr_t* old_data_space_capacity; // 6 | 2171 intptr_t* code_space_capacity; // 6 |
2194 intptr_t* code_space_size; // 7 | 2172 intptr_t* map_space_size; // 7 |
2195 intptr_t* code_space_capacity; // 8 | 2173 intptr_t* map_space_capacity; // 8 |
2196 intptr_t* map_space_size; // 9 | 2174 intptr_t* cell_space_size; // 9 |
2197 intptr_t* map_space_capacity; // 10 | 2175 intptr_t* cell_space_capacity; // 10 |
2198 intptr_t* cell_space_size; // 11 | 2176 intptr_t* lo_space_size; // 11 |
2199 intptr_t* cell_space_capacity; // 12 | 2177 int* global_handle_count; // 12 |
2200 intptr_t* lo_space_size; // 13 | 2178 int* weak_global_handle_count; // 13 |
2201 int* global_handle_count; // 14 | 2179 int* pending_global_handle_count; // 14 |
2202 int* weak_global_handle_count; // 15 | 2180 int* near_death_global_handle_count; // 15 |
2203 int* pending_global_handle_count; // 16 | 2181 int* free_global_handle_count; // 16 |
2204 int* near_death_global_handle_count; // 17 | 2182 intptr_t* memory_allocator_size; // 17 |
2205 int* free_global_handle_count; // 18 | 2183 intptr_t* memory_allocator_capacity; // 18 |
2206 intptr_t* memory_allocator_size; // 19 | 2184 int* objects_per_type; // 19 |
2207 intptr_t* memory_allocator_capacity; // 20 | 2185 int* size_per_type; // 20 |
2208 int* objects_per_type; // 21 | 2186 int* os_error; // 21 |
2209 int* size_per_type; // 22 | 2187 int* end_marker; // 22 |
2210 int* os_error; // 23 | 2188 intptr_t* property_cell_space_size; // 23 |
2211 int* end_marker; // 24 | 2189 intptr_t* property_cell_space_capacity; // 24 |
2212 intptr_t* property_cell_space_size; // 25 | |
2213 intptr_t* property_cell_space_capacity; // 26 | |
2214 }; | 2190 }; |
2215 | 2191 |
2216 | 2192 |
2217 class AlwaysAllocateScope { | 2193 class AlwaysAllocateScope { |
2218 public: | 2194 public: |
2219 explicit inline AlwaysAllocateScope(Isolate* isolate); | 2195 explicit inline AlwaysAllocateScope(Isolate* isolate); |
2220 inline ~AlwaysAllocateScope(); | 2196 inline ~AlwaysAllocateScope(); |
2221 | 2197 |
2222 private: | 2198 private: |
2223 // Implicitly disable artificial allocation failures. | 2199 // Implicitly disable artificial allocation failures. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2262 public: | 2238 public: |
2263 explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {} | 2239 explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {} |
2264 Space* next(); | 2240 Space* next(); |
2265 | 2241 |
2266 private: | 2242 private: |
2267 Heap* heap_; | 2243 Heap* heap_; |
2268 int counter_; | 2244 int counter_; |
2269 }; | 2245 }; |
2270 | 2246 |
2271 | 2247 |
2272 // Space iterator for iterating over all old spaces of the heap: Old pointer | 2248 // Space iterator for iterating over all old spaces of the heap: Old space |
2273 // space, old data space and code space. Returns each space in turn, and null | 2249 // and code space. Returns each space in turn, and null when it is done. |
2274 // when it is done. | |
2275 class OldSpaces BASE_EMBEDDED { | 2250 class OldSpaces BASE_EMBEDDED { |
2276 public: | 2251 public: |
2277 explicit OldSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {} | 2252 explicit OldSpaces(Heap* heap) : heap_(heap), counter_(OLD_SPACE) {} |
2278 OldSpace* next(); | 2253 OldSpace* next(); |
2279 | 2254 |
2280 private: | 2255 private: |
2281 Heap* heap_; | 2256 Heap* heap_; |
2282 int counter_; | 2257 int counter_; |
2283 }; | 2258 }; |
2284 | 2259 |
2285 | 2260 |
2286 // Space iterator for iterating over all the paged spaces of the heap: Map | 2261 // Space iterator for iterating over all the paged spaces of the heap: Map |
2287 // space, old pointer space, old data space, code space and cell space. Returns | 2262 // space, old space, code space and cell space. Returns |
2288 // each space in turn, and null when it is done. | 2263 // each space in turn, and null when it is done. |
2289 class PagedSpaces BASE_EMBEDDED { | 2264 class PagedSpaces BASE_EMBEDDED { |
2290 public: | 2265 public: |
2291 explicit PagedSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {} | 2266 explicit PagedSpaces(Heap* heap) : heap_(heap), counter_(OLD_SPACE) {} |
2292 PagedSpace* next(); | 2267 PagedSpace* next(); |
2293 | 2268 |
2294 private: | 2269 private: |
2295 Heap* heap_; | 2270 Heap* heap_; |
2296 int counter_; | 2271 int counter_; |
2297 }; | 2272 }; |
2298 | 2273 |
2299 | 2274 |
2300 // Space iterator for iterating over all spaces of the heap. | 2275 // Space iterator for iterating over all spaces of the heap. |
2301 // For each space an object iterator is provided. The deallocation of the | 2276 // For each space an object iterator is provided. The deallocation of the |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2624 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. | 2599 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. |
2625 | 2600 |
2626 private: | 2601 private: |
2627 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); | 2602 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); |
2628 }; | 2603 }; |
2629 #endif // DEBUG | 2604 #endif // DEBUG |
2630 } | 2605 } |
2631 } // namespace v8::internal | 2606 } // namespace v8::internal |
2632 | 2607 |
2633 #endif // V8_HEAP_HEAP_H_ | 2608 #endif // V8_HEAP_HEAP_H_ |
OLD | NEW |