| Index: src/heap/heap.h
|
| diff --git a/src/heap/heap.h b/src/heap/heap.h
|
| index 2809f6587987223366332a5d6a29811d42487bee..470b4cee20de407dfb5a7b6ea958ce8809e0cb31 100644
|
| --- a/src/heap/heap.h
|
| +++ b/src/heap/heap.h
|
| @@ -176,7 +176,6 @@ namespace internal {
|
| V(SeededNumberDictionary, empty_slow_element_dictionary, \
|
| EmptySlowElementDictionary) \
|
| V(FixedArray, materialized_objects, MaterializedObjects) \
|
| - V(FixedArray, allocation_sites_scratchpad, AllocationSitesScratchpad) \
|
| V(FixedArray, microtask_queue, MicrotaskQueue) \
|
| V(TypeFeedbackVector, dummy_vector, DummyVector) \
|
| V(FixedArray, cleared_optimized_code_map, ClearedOptimizedCodeMap) \
|
| @@ -636,7 +635,7 @@ class Heap {
|
| // - or mutator code (CONCURRENT_TO_SWEEPER).
|
| enum InvocationMode { SEQUENTIAL_TO_SWEEPER, CONCURRENT_TO_SWEEPER };
|
|
|
| - enum ScratchpadSlotMode { IGNORE_SCRATCHPAD_SLOT, RECORD_SCRATCHPAD_SLOT };
|
| + enum PretenuringFeedbackInsertionMode { kCached, kGlobal };
|
|
|
| enum HeapState { NOT_IN_GC, SCAVENGE, MARK_COMPACT };
|
|
|
| @@ -762,12 +761,6 @@ class Heap {
|
| // Checks whether the space is valid.
|
| static bool IsValidAllocationSpace(AllocationSpace space);
|
|
|
| - // An object may have an AllocationSite associated with it through a trailing
|
| - // AllocationMemento. Its feedback should be updated when objects are found
|
| - // in the heap.
|
| - static inline void UpdateAllocationSiteFeedback(HeapObject* object,
|
| - ScratchpadSlotMode mode);
|
| -
|
| // Generated code can embed direct references to non-writable roots if
|
| // they are in new space.
|
| static bool RootCanBeWrittenAfterInitialization(RootListIndex root_index);
|
| @@ -1544,6 +1537,27 @@ class Heap {
|
| return array_buffer_tracker_;
|
| }
|
|
|
| + // ===========================================================================
|
| + // Allocation site tracking. =================================================
|
| + // ===========================================================================
|
| +
|
| + // Updates the AllocationSite of a given {object}. If the global prenuring
|
| + // storage is passed as {pretenuring_feedback} the memento found count on
|
| + // the corresponding allocation site is immediately updated and an entry
|
| + // in the hash map is created. Otherwise the entry (including a the count
|
| + // value) is cached on the local pretenuring feedback.
|
| + inline void UpdateAllocationSite(HeapObject* object,
|
| + HashMap* pretenuring_feedback);
|
| +
|
| + // Removes an entry from the global pretenuring storage.
|
| + inline void RemoveAllocationSitePretenuringFeedback(AllocationSite* site);
|
| +
|
| + // Merges local pretenuring feedback into the global one. Note that this
|
| + // method needs to be called after evacuation, as allocation sites may be
|
| + // evacuated and this method resolves forward pointers accordingly.
|
| + void MergeAllocationSitePretenuringFeedback(
|
| + const HashMap& local_pretenuring_feedback);
|
| +
|
| // =============================================================================
|
|
|
| #ifdef VERIFY_HEAP
|
| @@ -1567,6 +1581,7 @@ class Heap {
|
| #endif
|
|
|
| private:
|
| + class PretenuringScope;
|
| class UnmapFreeMemoryTask;
|
|
|
| // External strings table is a place where all external strings are
|
| @@ -1661,7 +1676,7 @@ class Heap {
|
| static const int kMaxMarkCompactsInIdleRound = 7;
|
| static const int kIdleScavengeThreshold = 5;
|
|
|
| - static const int kAllocationSiteScratchpadSize = 256;
|
| + static const int kInitialFeedbackCapacity = 256;
|
|
|
| Heap();
|
|
|
| @@ -1703,12 +1718,6 @@ class Heap {
|
|
|
| void PreprocessStackTraces();
|
|
|
| - // Pretenuring decisions are made based on feedback collected during new
|
| - // space evacuation. Note that between feedback collection and calling this
|
| - // method object in old space must not move.
|
| - // Right now we only process pretenuring feedback in high promotion mode.
|
| - bool ProcessPretenuringFeedback();
|
| -
|
| // Checks whether a global GC is necessary
|
| GarbageCollector SelectGarbageCollector(AllocationSpace space,
|
| const char** reason);
|
| @@ -1788,16 +1797,6 @@ class Heap {
|
| // Flush the number to string cache.
|
| void FlushNumberStringCache();
|
|
|
| - // Sets used allocation sites entries to undefined.
|
| - void FlushAllocationSitesScratchpad();
|
| -
|
| - // Initializes the allocation sites scratchpad with undefined values.
|
| - void InitializeAllocationSitesScratchpad();
|
| -
|
| - // Adds an allocation site to the scratchpad if there is space left.
|
| - void AddAllocationSiteToScratchpad(AllocationSite* site,
|
| - ScratchpadSlotMode mode);
|
| -
|
| // TODO(hpayer): Allocation site pretenuring may make this method obsolete.
|
| // Re-visit incremental marking heuristics.
|
| bool IsHighSurvivalRate() { return high_survival_rate_period_length_ > 0; }
|
| @@ -1849,6 +1848,15 @@ class Heap {
|
| HistogramTimer* GCTypeTimer(GarbageCollector collector);
|
|
|
| // ===========================================================================
|
| + // Pretenuring. ==============================================================
|
| + // ===========================================================================
|
| +
|
| + // Pretenuring decisions are made based on feedback collected during new space
|
| + // evacuation. Note that between feedback collection and calling this method
|
| + // object in old space must not move.
|
| + void ProcessPretenuringFeedback();
|
| +
|
| + // ===========================================================================
|
| // Actual GC. ================================================================
|
| // ===========================================================================
|
|
|
| @@ -2143,6 +2151,8 @@ class Heap {
|
|
|
| MUST_USE_RESULT AllocationResult InternalizeString(String* str);
|
|
|
| + // ===========================================================================
|
| +
|
| void set_force_oom(bool value) { force_oom_ = value; }
|
|
|
| // The amount of external memory registered through the API kept alive
|
| @@ -2352,7 +2362,12 @@ class Heap {
|
| // deoptimization triggered by garbage collection.
|
| int gcs_since_last_deopt_;
|
|
|
| - int allocation_sites_scratchpad_length_;
|
| + // The feedback storage is used to store allocation sites (keys) and how often
|
| + // they have been visited (values) by finding a memento behind an object. The
|
| + // storage is only alive temporary during a GC. The invariant is that all
|
| + // pointers in this map are already fixed, i.e., they do not point to
|
| + // forwarding pointers.
|
| + HashMap* global_pretenuring_feedback_;
|
|
|
| char trace_ring_buffer_[kTraceRingBufferSize];
|
| // If it's not full then the data is from 0 to ring_buffer_end_. If it's
|
|
|