33 |
33 |
34 ShenandoahAdaptiveHeuristics::ShenandoahAdaptiveHeuristics() : |
34 ShenandoahAdaptiveHeuristics::ShenandoahAdaptiveHeuristics() : |
35 ShenandoahHeuristics(), |
35 ShenandoahHeuristics(), |
36 _cycle_gap_history(new TruncatedSeq(5)), |
36 _cycle_gap_history(new TruncatedSeq(5)), |
37 _conc_mark_duration_history(new TruncatedSeq(5)), |
37 _conc_mark_duration_history(new TruncatedSeq(5)), |
38 _conc_uprefs_duration_history(new TruncatedSeq(5)) { |
38 _conc_uprefs_duration_history(new TruncatedSeq(5)) {} |
39 |
|
40 SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent); |
|
41 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent); |
|
42 |
|
43 // Final configuration checks |
|
44 SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); |
|
45 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier); |
|
46 SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier); |
|
47 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); |
|
48 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier); |
|
49 } |
|
50 |
39 |
51 ShenandoahAdaptiveHeuristics::~ShenandoahAdaptiveHeuristics() {} |
40 ShenandoahAdaptiveHeuristics::~ShenandoahAdaptiveHeuristics() {} |
52 |
41 |
53 void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset, |
42 void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset, |
54 RegionData* data, size_t size, |
43 RegionData* data, size_t size, |
119 } else if (phase == ShenandoahPhaseTimings::conc_update_refs) { |
108 } else if (phase == ShenandoahPhaseTimings::conc_update_refs) { |
120 _conc_uprefs_duration_history->add(secs); |
109 _conc_uprefs_duration_history->add(secs); |
121 } // Else ignore |
110 } // Else ignore |
122 } |
111 } |
123 |
112 |
124 bool ShenandoahAdaptiveHeuristics::should_start_normal_gc() const { |
113 bool ShenandoahAdaptiveHeuristics::should_start_gc() const { |
125 ShenandoahHeap* heap = ShenandoahHeap::heap(); |
114 ShenandoahHeap* heap = ShenandoahHeap::heap(); |
126 size_t capacity = heap->max_capacity(); |
115 size_t capacity = heap->max_capacity(); |
127 size_t available = heap->free_set()->available(); |
116 size_t available = heap->free_set()->available(); |
128 |
117 |
129 // Check if we are falling below the worst limit, time to trigger the GC, regardless of |
118 // Check if we are falling below the worst limit, time to trigger the GC, regardless of |
170 log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M", |
159 log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M", |
171 available / M, spike_headroom / M, penalties / M, allocation_headroom / M); |
160 available / M, spike_headroom / M, penalties / M, allocation_headroom / M); |
172 return true; |
161 return true; |
173 } |
162 } |
174 |
163 |
175 return ShenandoahHeuristics::should_start_normal_gc(); |
164 return ShenandoahHeuristics::should_start_gc(); |
176 } |
165 } |
177 |
166 |
178 bool ShenandoahAdaptiveHeuristics::should_start_update_refs() { |
167 bool ShenandoahAdaptiveHeuristics::should_start_update_refs() { |
179 if (! _update_refs_adaptive) { |
168 if (! _update_refs_adaptive) { |
180 return _update_refs_early; |
169 return _update_refs_early; |