| 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 #include <map> | 9 #include <map> |
| 10 | 10 |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 | 341 |
| 342 enum ArrayStorageAllocationMode { | 342 enum ArrayStorageAllocationMode { |
| 343 DONT_INITIALIZE_ARRAY_ELEMENTS, | 343 DONT_INITIALIZE_ARRAY_ELEMENTS, |
| 344 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE | 344 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE |
| 345 }; | 345 }; |
| 346 | 346 |
| 347 enum class ClearRecordedSlots { kYes, kNo }; | 347 enum class ClearRecordedSlots { kYes, kNo }; |
| 348 | 348 |
| 349 enum class ClearBlackArea { kYes, kNo }; | 349 enum class ClearBlackArea { kYes, kNo }; |
| 350 | 350 |
| 351 enum class GarbageCollectionReason { |
| 352 kUnknown, |
| 353 kAllocationFailure, |
| 354 kAllocationLimit, |
| 355 kContextDisposal, |
| 356 kCountersExtension, |
| 357 kDebugger, |
| 358 kDeserializer, |
| 359 kExternalMemoryPressure, |
| 360 kFinalizeMarkingViaStackGuard, |
| 361 kFinalizeMarkingViaTask, |
| 362 kFullHashtable, |
| 363 kHeapProfiler, |
| 364 kIdleTask, |
| 365 kLastResort, |
| 366 kLowMemoryNotification, |
| 367 kMakeHeapIterable, |
| 368 kMemoryPressure, |
| 369 kMemoryReducer, |
| 370 kRuntime, |
| 371 kSamplingProfiler, |
| 372 kSnapshotCreator, |
| 373 kTesting |
| 374 }; |
| 375 |
| 351 // A queue of objects promoted during scavenge. Each object is accompanied by | 376 // A queue of objects promoted during scavenge. Each object is accompanied by |
| 352 // its size to avoid dereferencing a map pointer for scanning. The last page in | 377 // its size to avoid dereferencing a map pointer for scanning. The last page in |
| 353 // to-space is used for the promotion queue. On conflict during scavenge, the | 378 // to-space is used for the promotion queue. On conflict during scavenge, the |
| 354 // promotion queue is allocated externally and all entries are copied to the | 379 // promotion queue is allocated externally and all entries are copied to the |
| 355 // external queue. | 380 // external queue. |
| 356 class PromotionQueue { | 381 class PromotionQueue { |
| 357 public: | 382 public: |
| 358 explicit PromotionQueue(Heap* heap) | 383 explicit PromotionQueue(Heap* heap) |
| 359 : front_(nullptr), | 384 : front_(nullptr), |
| 360 rear_(nullptr), | 385 rear_(nullptr), |
| (...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1072 void DisableInlineAllocation(); | 1097 void DisableInlineAllocation(); |
| 1073 | 1098 |
| 1074 // =========================================================================== | 1099 // =========================================================================== |
| 1075 // Methods triggering GCs. =================================================== | 1100 // Methods triggering GCs. =================================================== |
| 1076 // =========================================================================== | 1101 // =========================================================================== |
| 1077 | 1102 |
| 1078 // Performs garbage collection operation. | 1103 // Performs garbage collection operation. |
| 1079 // Returns whether there is a chance that another major GC could | 1104 // Returns whether there is a chance that another major GC could |
| 1080 // collect more garbage. | 1105 // collect more garbage. |
| 1081 inline bool CollectGarbage( | 1106 inline bool CollectGarbage( |
| 1082 AllocationSpace space, const char* gc_reason = NULL, | 1107 AllocationSpace space, GarbageCollectionReason gc_reason, |
| 1083 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1108 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1084 | 1109 |
| 1085 // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is | 1110 // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is |
| 1086 // non-zero, then the slower precise sweeper is used, which leaves the heap | 1111 // non-zero, then the slower precise sweeper is used, which leaves the heap |
| 1087 // in a state where we can iterate over the heap visiting all objects. | 1112 // in a state where we can iterate over the heap visiting all objects. |
| 1088 void CollectAllGarbage( | 1113 void CollectAllGarbage( |
| 1089 int flags = kFinalizeIncrementalMarkingMask, const char* gc_reason = NULL, | 1114 int flags, GarbageCollectionReason gc_reason, |
| 1090 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1115 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1091 | 1116 |
| 1092 // Last hope GC, should try to squeeze as much as possible. | 1117 // Last hope GC, should try to squeeze as much as possible. |
| 1093 void CollectAllAvailableGarbage(const char* gc_reason = NULL); | 1118 void CollectAllAvailableGarbage(GarbageCollectionReason gc_reason); |
| 1094 | 1119 |
| 1095 // Reports and external memory pressure event, either performs a major GC or | 1120 // Reports and external memory pressure event, either performs a major GC or |
| 1096 // completes incremental marking in order to free external resources. | 1121 // completes incremental marking in order to free external resources. |
| 1097 void ReportExternalMemoryPressure(const char* gc_reason = NULL); | 1122 void ReportExternalMemoryPressure(); |
| 1098 | 1123 |
| 1099 // Invoked when GC was requested via the stack guard. | 1124 // Invoked when GC was requested via the stack guard. |
| 1100 void HandleGCRequest(); | 1125 void HandleGCRequest(); |
| 1101 | 1126 |
| 1102 // =========================================================================== | 1127 // =========================================================================== |
| 1103 // Iterators. ================================================================ | 1128 // Iterators. ================================================================ |
| 1104 // =========================================================================== | 1129 // =========================================================================== |
| 1105 | 1130 |
| 1106 // Iterates over all roots in the heap. | 1131 // Iterates over all roots in the heap. |
| 1107 void IterateRoots(ObjectVisitor* v, VisitMode mode); | 1132 void IterateRoots(ObjectVisitor* v, VisitMode mode); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1138 | 1163 |
| 1139 void ClearRecordedSlot(HeapObject* object, Object** slot); | 1164 void ClearRecordedSlot(HeapObject* object, Object** slot); |
| 1140 void ClearRecordedSlotRange(Address start, Address end); | 1165 void ClearRecordedSlotRange(Address start, Address end); |
| 1141 | 1166 |
| 1142 // =========================================================================== | 1167 // =========================================================================== |
| 1143 // Incremental marking API. ================================================== | 1168 // Incremental marking API. ================================================== |
| 1144 // =========================================================================== | 1169 // =========================================================================== |
| 1145 | 1170 |
| 1146 // Start incremental marking and ensure that idle time handler can perform | 1171 // Start incremental marking and ensure that idle time handler can perform |
| 1147 // incremental steps. | 1172 // incremental steps. |
| 1148 void StartIdleIncrementalMarking(); | 1173 void StartIdleIncrementalMarking(GarbageCollectionReason gc_reason); |
| 1149 | 1174 |
| 1150 // Starts incremental marking assuming incremental marking is currently | 1175 // Starts incremental marking assuming incremental marking is currently |
| 1151 // stopped. | 1176 // stopped. |
| 1152 void StartIncrementalMarking(int gc_flags = kNoGCFlags, | 1177 void StartIncrementalMarking( |
| 1153 const GCCallbackFlags gc_callback_flags = | 1178 int gc_flags, GarbageCollectionReason gc_reason, |
| 1154 GCCallbackFlags::kNoGCCallbackFlags, | 1179 GCCallbackFlags gc_callback_flags = GCCallbackFlags::kNoGCCallbackFlags); |
| 1155 const char* reason = nullptr); | |
| 1156 | 1180 |
| 1157 void StartIncrementalMarkingIfNeeded(int gc_flags = kNoGCFlags, | 1181 void StartIncrementalMarkingIfAllocationLimitIsReached( |
| 1158 const GCCallbackFlags gc_callback_flags = | 1182 int gc_flags, |
| 1159 GCCallbackFlags::kNoGCCallbackFlags, | 1183 GCCallbackFlags gc_callback_flags = GCCallbackFlags::kNoGCCallbackFlags); |
| 1160 const char* reason = nullptr); | |
| 1161 | 1184 |
| 1162 void FinalizeIncrementalMarkingIfComplete(const char* comment); | 1185 void FinalizeIncrementalMarkingIfComplete(GarbageCollectionReason gc_reason); |
| 1163 | 1186 |
| 1164 bool TryFinalizeIdleIncrementalMarking(double idle_time_in_ms); | 1187 bool TryFinalizeIdleIncrementalMarking(double idle_time_in_ms, |
| 1188 GarbageCollectionReason gc_reason); |
| 1165 | 1189 |
| 1166 void RegisterReservationsForBlackAllocation(Reservation* reservations); | 1190 void RegisterReservationsForBlackAllocation(Reservation* reservations); |
| 1167 | 1191 |
| 1168 IncrementalMarking* incremental_marking() { return incremental_marking_; } | 1192 IncrementalMarking* incremental_marking() { return incremental_marking_; } |
| 1169 | 1193 |
| 1170 // =========================================================================== | 1194 // =========================================================================== |
| 1171 // Embedder heap tracer support. ============================================= | 1195 // Embedder heap tracer support. ============================================= |
| 1172 // =========================================================================== | 1196 // =========================================================================== |
| 1173 | 1197 |
| 1174 void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer); | 1198 void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1606 void EnsureFillerObjectAtTop(); | 1630 void EnsureFillerObjectAtTop(); |
| 1607 | 1631 |
| 1608 // Ensure that we have swept all spaces in such a way that we can iterate | 1632 // Ensure that we have swept all spaces in such a way that we can iterate |
| 1609 // over all objects. May cause a GC. | 1633 // over all objects. May cause a GC. |
| 1610 void MakeHeapIterable(); | 1634 void MakeHeapIterable(); |
| 1611 | 1635 |
| 1612 // Performs garbage collection operation. | 1636 // Performs garbage collection operation. |
| 1613 // Returns whether there is a chance that another major GC could | 1637 // Returns whether there is a chance that another major GC could |
| 1614 // collect more garbage. | 1638 // collect more garbage. |
| 1615 bool CollectGarbage( | 1639 bool CollectGarbage( |
| 1616 GarbageCollector collector, const char* gc_reason, | 1640 GarbageCollector collector, GarbageCollectionReason gc_reason, |
| 1617 const char* collector_reason, | 1641 const char* collector_reason, |
| 1618 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1642 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1619 | 1643 |
| 1620 // Performs garbage collection | 1644 // Performs garbage collection |
| 1621 // Returns whether there is a chance another major GC could | 1645 // Returns whether there is a chance another major GC could |
| 1622 // collect more garbage. | 1646 // collect more garbage. |
| 1623 bool PerformGarbageCollection( | 1647 bool PerformGarbageCollection( |
| 1624 GarbageCollector collector, | 1648 GarbageCollector collector, |
| 1625 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1649 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1626 | 1650 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 | 1705 |
| 1682 void ConfigureInitialOldGenerationSize(); | 1706 void ConfigureInitialOldGenerationSize(); |
| 1683 | 1707 |
| 1684 bool HasLowYoungGenerationAllocationRate(); | 1708 bool HasLowYoungGenerationAllocationRate(); |
| 1685 bool HasLowOldGenerationAllocationRate(); | 1709 bool HasLowOldGenerationAllocationRate(); |
| 1686 double YoungGenerationMutatorUtilization(); | 1710 double YoungGenerationMutatorUtilization(); |
| 1687 double OldGenerationMutatorUtilization(); | 1711 double OldGenerationMutatorUtilization(); |
| 1688 | 1712 |
| 1689 void ReduceNewSpaceSize(); | 1713 void ReduceNewSpaceSize(); |
| 1690 | 1714 |
| 1691 bool TryFinalizeIdleIncrementalMarking( | |
| 1692 double idle_time_in_ms, size_t size_of_objects, | |
| 1693 size_t mark_compact_speed_in_bytes_per_ms); | |
| 1694 | |
| 1695 GCIdleTimeHeapState ComputeHeapState(); | 1715 GCIdleTimeHeapState ComputeHeapState(); |
| 1696 | 1716 |
| 1697 bool PerformIdleTimeAction(GCIdleTimeAction action, | 1717 bool PerformIdleTimeAction(GCIdleTimeAction action, |
| 1698 GCIdleTimeHeapState heap_state, | 1718 GCIdleTimeHeapState heap_state, |
| 1699 double deadline_in_ms); | 1719 double deadline_in_ms); |
| 1700 | 1720 |
| 1701 void IdleNotificationEpilogue(GCIdleTimeAction action, | 1721 void IdleNotificationEpilogue(GCIdleTimeAction action, |
| 1702 GCIdleTimeHeapState heap_state, double start_ms, | 1722 GCIdleTimeHeapState heap_state, double start_ms, |
| 1703 double deadline_in_ms); | 1723 double deadline_in_ms); |
| 1704 | 1724 |
| 1705 inline void UpdateAllocationsHash(HeapObject* object); | 1725 inline void UpdateAllocationsHash(HeapObject* object); |
| 1706 inline void UpdateAllocationsHash(uint32_t value); | 1726 inline void UpdateAllocationsHash(uint32_t value); |
| 1707 void PrintAlloctionsHash(); | 1727 void PrintAlloctionsHash(); |
| 1708 | 1728 |
| 1709 void AddToRingBuffer(const char* string); | 1729 void AddToRingBuffer(const char* string); |
| 1710 void GetFromRingBuffer(char* buffer); | 1730 void GetFromRingBuffer(char* buffer); |
| 1711 | 1731 |
| 1712 void CompactRetainedMaps(ArrayList* retained_maps); | 1732 void CompactRetainedMaps(ArrayList* retained_maps); |
| 1713 | 1733 |
| 1714 void CollectGarbageOnMemoryPressure(const char* source); | 1734 void CollectGarbageOnMemoryPressure(); |
| 1715 | 1735 |
| 1716 // Attempt to over-approximate the weak closure by marking object groups and | 1736 // Attempt to over-approximate the weak closure by marking object groups and |
| 1717 // implicit references from global handles, but don't atomically complete | 1737 // implicit references from global handles, but don't atomically complete |
| 1718 // marking. If we continue to mark incrementally, we might have marked | 1738 // marking. If we continue to mark incrementally, we might have marked |
| 1719 // objects that die later. | 1739 // objects that die later. |
| 1720 void FinalizeIncrementalMarking(const char* gc_reason); | 1740 void FinalizeIncrementalMarking(GarbageCollectionReason gc_reason); |
| 1721 | 1741 |
| 1722 // Returns the timer used for a given GC type. | 1742 // Returns the timer used for a given GC type. |
| 1723 // - GCScavenger: young generation GC | 1743 // - GCScavenger: young generation GC |
| 1724 // - GCCompactor: full GC | 1744 // - GCCompactor: full GC |
| 1725 // - GCFinalzeMC: finalization of incremental full GC | 1745 // - GCFinalzeMC: finalization of incremental full GC |
| 1726 // - GCFinalizeMCReduceMemory: finalization of incremental full GC with | 1746 // - GCFinalizeMCReduceMemory: finalization of incremental full GC with |
| 1727 // memory reduction | 1747 // memory reduction |
| 1728 HistogramTimer* GCTypeTimer(GarbageCollector collector); | 1748 HistogramTimer* GCTypeTimer(GarbageCollector collector); |
| 1729 | 1749 |
| 1730 // =========================================================================== | 1750 // =========================================================================== |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2612 friend class LargeObjectSpace; | 2632 friend class LargeObjectSpace; |
| 2613 friend class NewSpace; | 2633 friend class NewSpace; |
| 2614 friend class PagedSpace; | 2634 friend class PagedSpace; |
| 2615 DISALLOW_COPY_AND_ASSIGN(AllocationObserver); | 2635 DISALLOW_COPY_AND_ASSIGN(AllocationObserver); |
| 2616 }; | 2636 }; |
| 2617 | 2637 |
| 2618 } // namespace internal | 2638 } // namespace internal |
| 2619 } // namespace v8 | 2639 } // namespace v8 |
| 2620 | 2640 |
| 2621 #endif // V8_HEAP_HEAP_H_ | 2641 #endif // V8_HEAP_HEAP_H_ |
| OLD | NEW |