23
24 #include "precompiled.hpp"
25
26 #include "gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp"
27 #include "gc/shenandoah/shenandoahCollectionSet.hpp"
28 #include "gc/shenandoah/shenandoahFreeSet.hpp"
29 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
30 #include "logging/log.hpp"
31 #include "logging/logTag.hpp"
32
33 ShenandoahStaticHeuristics::ShenandoahStaticHeuristics() : ShenandoahHeuristics() {
34 // Static heuristics may degrade to continuous if live data is larger
35 // than free threshold. ShenandoahAllocationThreshold is supposed to break this,
36 // but it only works if it is non-zero.
37 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 1);
38
39 SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
40 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
41
42 // Final configuration checks
43 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
44 SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
45 SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
46 SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
47 SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
48 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
49 SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
50 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
51 }
52
53 ShenandoahStaticHeuristics::~ShenandoahStaticHeuristics() {}
54
55 bool ShenandoahStaticHeuristics::should_start_normal_gc() const {
56 ShenandoahHeap* heap = ShenandoahHeap::heap();
57
58 size_t capacity = heap->capacity();
59 size_t available = heap->free_set()->available();
60 size_t threshold_available = (capacity * ShenandoahFreeThreshold) / 100;
61
62 if (available < threshold_available) {
63 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below free threshold (" SIZE_FORMAT "M)",
64 available / M, threshold_available / M);
65 return true;
66 }
67 return ShenandoahHeuristics::should_start_normal_gc();
68 }
69
|
23
24 #include "precompiled.hpp"
25
26 #include "gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp"
27 #include "gc/shenandoah/shenandoahCollectionSet.hpp"
28 #include "gc/shenandoah/shenandoahFreeSet.hpp"
29 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
30 #include "logging/log.hpp"
31 #include "logging/logTag.hpp"
32
33 ShenandoahStaticHeuristics::ShenandoahStaticHeuristics() : ShenandoahHeuristics() {
34 // Static heuristics may degrade to continuous if live data is larger
35 // than free threshold. ShenandoahAllocationThreshold is supposed to break this,
36 // but it only works if it is non-zero.
37 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 1);
38
39 SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
40 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
41
42 // Final configuration checks
43 SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier);
44 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
45 SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
46 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
47 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
48 }
49
50 ShenandoahStaticHeuristics::~ShenandoahStaticHeuristics() {}
51
52 bool ShenandoahStaticHeuristics::should_start_normal_gc() const {
53 ShenandoahHeap* heap = ShenandoahHeap::heap();
54
55 size_t capacity = heap->capacity();
56 size_t available = heap->free_set()->available();
57 size_t threshold_available = (capacity * ShenandoahFreeThreshold) / 100;
58
59 if (available < threshold_available) {
60 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below free threshold (" SIZE_FORMAT "M)",
61 available / M, threshold_available / M);
62 return true;
63 }
64 return ShenandoahHeuristics::should_start_normal_gc();
65 }
66
|