Chromium Code Reviews| 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_H_ | 5 #ifndef V8_HEAP_H_ |
| 6 #define V8_HEAP_H_ | 6 #define V8_HEAP_H_ |
| 7 | 7 |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "allocation.h" | 10 #include "allocation.h" |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1028 // Support for the API. | 1028 // Support for the API. |
| 1029 // | 1029 // |
| 1030 | 1030 |
| 1031 void CreateApiObjects(); | 1031 void CreateApiObjects(); |
| 1032 | 1032 |
| 1033 // Adjusts the amount of registered external memory. | 1033 // Adjusts the amount of registered external memory. |
| 1034 // Returns the adjusted value. | 1034 // Returns the adjusted value. |
| 1035 inline int64_t AdjustAmountOfExternalAllocatedMemory( | 1035 inline int64_t AdjustAmountOfExternalAllocatedMemory( |
| 1036 int64_t change_in_bytes); | 1036 int64_t change_in_bytes); |
| 1037 | 1037 |
| 1038 // This is only needed for testing high promotion mode. | |
| 1039 void SetNewSpaceHighPromotionModeActive(bool mode) { | |
| 1040 new_space_high_promotion_mode_active_ = mode; | |
| 1041 } | |
| 1042 | |
| 1043 // Returns the allocation mode (pre-tenuring) based on observed promotion | 1038 // Returns the allocation mode (pre-tenuring) based on observed promotion |
| 1044 // rates of previous collections. | 1039 // rates of previous collections. |
| 1045 inline PretenureFlag GetPretenureMode() { | 1040 inline PretenureFlag GetPretenureMode() { |
| 1046 return FLAG_pretenuring && new_space_high_promotion_mode_active_ | 1041 return FLAG_pretenuring ? TENURED : NOT_TENURED; |
| 1047 ? TENURED : NOT_TENURED; | |
| 1048 } | |
| 1049 | |
| 1050 inline Address* NewSpaceHighPromotionModeActiveAddress() { | |
| 1051 return reinterpret_cast<Address*>(&new_space_high_promotion_mode_active_); | |
| 1052 } | 1042 } |
| 1053 | 1043 |
| 1054 inline intptr_t PromotedTotalSize() { | 1044 inline intptr_t PromotedTotalSize() { |
| 1055 int64_t total = PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize(); | 1045 int64_t total = PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize(); |
| 1056 if (total > kMaxInt) return static_cast<intptr_t>(kMaxInt); | 1046 if (total > kMaxInt) return static_cast<intptr_t>(kMaxInt); |
| 1057 if (total < 0) return 0; | 1047 if (total < 0) return 0; |
| 1058 return static_cast<intptr_t>(total); | 1048 return static_cast<intptr_t>(total); |
| 1059 } | 1049 } |
| 1060 | 1050 |
| 1061 inline intptr_t OldGenerationSpaceAvailable() { | 1051 inline intptr_t OldGenerationSpaceAvailable() { |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1575 ROOT_LIST(ROOT_ACCESSOR) | 1565 ROOT_LIST(ROOT_ACCESSOR) |
| 1576 #undef ROOT_ACCESSOR | 1566 #undef ROOT_ACCESSOR |
| 1577 | 1567 |
| 1578 #ifdef DEBUG | 1568 #ifdef DEBUG |
| 1579 // If the --gc-interval flag is set to a positive value, this | 1569 // If the --gc-interval flag is set to a positive value, this |
| 1580 // variable holds the value indicating the number of allocations | 1570 // variable holds the value indicating the number of allocations |
| 1581 // remain until the next failure and garbage collection. | 1571 // remain until the next failure and garbage collection. |
| 1582 int allocation_timeout_; | 1572 int allocation_timeout_; |
| 1583 #endif // DEBUG | 1573 #endif // DEBUG |
| 1584 | 1574 |
| 1585 // Indicates that the new space should be kept small due to high promotion | |
| 1586 // rates caused by the mutator allocating a lot of long-lived objects. | |
| 1587 // TODO(hpayer): change to bool if no longer accessed from generated code | |
| 1588 intptr_t new_space_high_promotion_mode_active_; | |
| 1589 | |
| 1590 // Limit that triggers a global GC on the next (normally caused) GC. This | 1575 // Limit that triggers a global GC on the next (normally caused) GC. This |
| 1591 // is checked when we have already decided to do a GC to help determine | 1576 // is checked when we have already decided to do a GC to help determine |
| 1592 // which collector to invoke, before expanding a paged space in the old | 1577 // which collector to invoke, before expanding a paged space in the old |
| 1593 // generation and on every allocation in large object space. | 1578 // generation and on every allocation in large object space. |
| 1594 intptr_t old_generation_allocation_limit_; | 1579 intptr_t old_generation_allocation_limit_; |
| 1595 | 1580 |
| 1596 // Used to adjust the limits that control the timing of the next GC. | 1581 // Used to adjust the limits that control the timing of the next GC. |
| 1597 intptr_t size_of_old_gen_at_last_old_space_gc_; | 1582 intptr_t size_of_old_gen_at_last_old_space_gc_; |
| 1598 | 1583 |
| 1599 // Limit on the amount of externally allocated memory allowed | 1584 // Limit on the amount of externally allocated memory allowed |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2020 // Sets used allocation sites entries to undefined. | 2005 // Sets used allocation sites entries to undefined. |
| 2021 void FlushAllocationSitesScratchpad(); | 2006 void FlushAllocationSitesScratchpad(); |
| 2022 | 2007 |
| 2023 // Initializes the allocation sites scratchpad with undefined values. | 2008 // Initializes the allocation sites scratchpad with undefined values. |
| 2024 void InitializeAllocationSitesScratchpad(); | 2009 void InitializeAllocationSitesScratchpad(); |
| 2025 | 2010 |
| 2026 // Adds an allocation site to the scratchpad if there is space left. | 2011 // Adds an allocation site to the scratchpad if there is space left. |
| 2027 void AddAllocationSiteToScratchpad(AllocationSite* site, | 2012 void AddAllocationSiteToScratchpad(AllocationSite* site, |
| 2028 ScratchpadSlotMode mode); | 2013 ScratchpadSlotMode mode); |
| 2029 | 2014 |
| 2030 void UpdateSurvivalRateTrend(int start_new_space_size); | 2015 void UpdateSurvivalStatistics(int start_new_space_size); |
| 2031 | |
| 2032 enum SurvivalRateTrend { INCREASING, STABLE, DECREASING, FLUCTUATING }; | |
| 2033 | 2016 |
| 2034 static const int kYoungSurvivalRateHighThreshold = 90; | 2017 static const int kYoungSurvivalRateHighThreshold = 90; |
| 2035 static const int kYoungSurvivalRateLowThreshold = 10; | |
| 2036 static const int kYoungSurvivalRateAllowedDeviation = 15; | 2018 static const int kYoungSurvivalRateAllowedDeviation = 15; |
| 2037 | 2019 |
| 2038 static const int kOldSurvivalRateLowThreshold = 10; | 2020 static const int kOldSurvivalRateLowThreshold = 10; |
| 2039 | 2021 |
| 2040 int high_survival_rate_period_length_; | 2022 int high_survival_rate_period_length_; |
| 2041 int low_survival_rate_period_length_; | |
| 2042 double survival_rate_; | |
| 2043 intptr_t promoted_objects_size_; | 2023 intptr_t promoted_objects_size_; |
| 2044 double promotion_rate_; | 2024 double promotion_rate_; |
| 2045 intptr_t semi_space_copied_object_size_; | 2025 intptr_t semi_space_copied_object_size_; |
| 2046 double semi_space_copied_rate_; | 2026 double semi_space_copied_rate_; |
| 2047 SurvivalRateTrend previous_survival_rate_trend_; | |
| 2048 SurvivalRateTrend survival_rate_trend_; | |
| 2049 | |
| 2050 void set_survival_rate_trend(SurvivalRateTrend survival_rate_trend) { | |
| 2051 ASSERT(survival_rate_trend != FLUCTUATING); | |
| 2052 previous_survival_rate_trend_ = survival_rate_trend_; | |
| 2053 survival_rate_trend_ = survival_rate_trend; | |
| 2054 } | |
| 2055 | |
| 2056 SurvivalRateTrend survival_rate_trend() { | |
| 2057 if (survival_rate_trend_ == STABLE) { | |
| 2058 return STABLE; | |
| 2059 } else if (previous_survival_rate_trend_ == STABLE) { | |
| 2060 return survival_rate_trend_; | |
| 2061 } else if (survival_rate_trend_ != previous_survival_rate_trend_) { | |
| 2062 return FLUCTUATING; | |
| 2063 } else { | |
| 2064 return survival_rate_trend_; | |
| 2065 } | |
| 2066 } | |
| 2067 | |
| 2068 bool IsStableOrIncreasingSurvivalTrend() { | |
| 2069 switch (survival_rate_trend()) { | |
| 2070 case STABLE: | |
| 2071 case INCREASING: | |
| 2072 return true; | |
| 2073 default: | |
| 2074 return false; | |
| 2075 } | |
| 2076 } | |
| 2077 | |
| 2078 bool IsStableOrDecreasingSurvivalTrend() { | |
| 2079 switch (survival_rate_trend()) { | |
| 2080 case STABLE: | |
| 2081 case DECREASING: | |
| 2082 return true; | |
| 2083 default: | |
| 2084 return false; | |
| 2085 } | |
| 2086 } | |
| 2087 | |
| 2088 bool IsIncreasingSurvivalTrend() { | |
| 2089 return survival_rate_trend() == INCREASING; | |
| 2090 } | |
| 2091 | 2027 |
| 2092 bool IsHighSurvivalRate() { | 2028 bool IsHighSurvivalRate() { |
|
Michael Starzinger
2014/05/26 12:47:33
As discussed offline: Can we leave a TODO here to
Hannes Payer (out of office)
2014/05/26 12:57:39
Done.
| |
| 2093 return high_survival_rate_period_length_ > 0; | 2029 return high_survival_rate_period_length_ > 0; |
| 2094 } | 2030 } |
| 2095 | 2031 |
| 2096 bool IsLowSurvivalRate() { | |
| 2097 return low_survival_rate_period_length_ > 0; | |
| 2098 } | |
| 2099 | |
| 2100 void SelectScavengingVisitorsTable(); | 2032 void SelectScavengingVisitorsTable(); |
| 2101 | 2033 |
| 2102 void StartIdleRound() { | 2034 void StartIdleRound() { |
| 2103 mark_sweeps_since_idle_round_started_ = 0; | 2035 mark_sweeps_since_idle_round_started_ = 0; |
| 2104 } | 2036 } |
| 2105 | 2037 |
| 2106 void FinishIdleRound() { | 2038 void FinishIdleRound() { |
| 2107 mark_sweeps_since_idle_round_started_ = kMaxMarkSweepsInIdleRound; | 2039 mark_sweeps_since_idle_round_started_ = kMaxMarkSweepsInIdleRound; |
| 2108 scavenges_since_last_idle_round_ = 0; | 2040 scavenges_since_last_idle_round_ = 0; |
| 2109 } | 2041 } |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2833 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. | 2765 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. |
| 2834 | 2766 |
| 2835 private: | 2767 private: |
| 2836 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); | 2768 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); |
| 2837 }; | 2769 }; |
| 2838 #endif // DEBUG | 2770 #endif // DEBUG |
| 2839 | 2771 |
| 2840 } } // namespace v8::internal | 2772 } } // namespace v8::internal |
| 2841 | 2773 |
| 2842 #endif // V8_HEAP_H_ | 2774 #endif // V8_HEAP_H_ |
| OLD | NEW |