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