25
26 #include "gc/shenandoah/shenandoahCollectionSet.hpp"
27 #include "gc/shenandoah/heuristics/shenandoahCompactHeuristics.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 ShenandoahCompactHeuristics::ShenandoahCompactHeuristics() : ShenandoahHeuristics() {
34 SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
35 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
36 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahUncommit);
37 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahAlwaysClearSoftRefs);
38 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 10);
39 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100);
40 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUncommitDelay, 1000);
41 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGuaranteedGCInterval, 30000);
42 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGarbageThreshold, 10);
43
44 // Final configuration checks
45 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
46 SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
47 SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
48 SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
49 SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
50 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
51 SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
52 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
53 }
54
55 bool ShenandoahCompactHeuristics::should_start_normal_gc() const {
56 ShenandoahHeap* heap = ShenandoahHeap::heap();
57
58 size_t available = heap->free_set()->available();
59 size_t threshold_bytes_allocated = heap->capacity() * ShenandoahAllocationThreshold / 100;
60 size_t min_threshold = ShenandoahMinFreeThreshold * heap->capacity() / 100;
61
62 if (available < min_threshold) {
63 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
64 available / M, min_threshold / M);
65 return true;
66 }
67
68 if (available < threshold_bytes_allocated) {
69 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is lower than allocated recently (" SIZE_FORMAT "M)",
70 available / M, threshold_bytes_allocated / M);
71 return true;
|
25
26 #include "gc/shenandoah/shenandoahCollectionSet.hpp"
27 #include "gc/shenandoah/heuristics/shenandoahCompactHeuristics.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 ShenandoahCompactHeuristics::ShenandoahCompactHeuristics() : ShenandoahHeuristics() {
34 SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
35 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
36 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahUncommit);
37 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahAlwaysClearSoftRefs);
38 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 10);
39 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100);
40 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUncommitDelay, 1000);
41 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGuaranteedGCInterval, 30000);
42 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGarbageThreshold, 10);
43
44 // Final configuration checks
45 SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier);
46 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
47 SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
48 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
49 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
50 }
51
52 bool ShenandoahCompactHeuristics::should_start_normal_gc() const {
53 ShenandoahHeap* heap = ShenandoahHeap::heap();
54
55 size_t available = heap->free_set()->available();
56 size_t threshold_bytes_allocated = heap->capacity() * ShenandoahAllocationThreshold / 100;
57 size_t min_threshold = ShenandoahMinFreeThreshold * heap->capacity() / 100;
58
59 if (available < min_threshold) {
60 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
61 available / M, min_threshold / M);
62 return true;
63 }
64
65 if (available < threshold_bytes_allocated) {
66 log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is lower than allocated recently (" SIZE_FORMAT "M)",
67 available / M, threshold_bytes_allocated / M);
68 return true;
|