16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "gc_implementation/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp"
26 #include "gc_implementation/shenandoah/shenandoahCollectionSet.hpp"
27 #include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp"
28 #include "gc_implementation/shenandoah/shenandoahLogging.hpp"
29
30 ShenandoahAggressiveHeuristics::ShenandoahAggressiveHeuristics() : ShenandoahHeuristics() {
31 // Do not shortcut evacuation
32 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100);
33
34 // Aggressive runs with max speed for allocation, to capture races against mutator
35 SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahPacing);
36 }
37
38 void ShenandoahAggressiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
39 RegionData* data, size_t size,
40 size_t free) {
41 for (size_t idx = 0; idx < size; idx++) {
42 ShenandoahHeapRegion* r = data[idx]._region;
43 if (r->garbage() > 0) {
44 cset->add_region(r);
45 }
46 }
47 }
48
49 bool ShenandoahAggressiveHeuristics::should_start_normal_gc() const {
50 return true;
51 }
52
53 bool ShenandoahAggressiveHeuristics::should_process_references() {
54 if (ShenandoahRefProcFrequency == 0) return false;
55 // Randomly process refs with 50% chance.
56 return (os::random() & 1) == 1;
57 }
58
59 bool ShenandoahAggressiveHeuristics::should_unload_classes() {
60 if (ShenandoahUnloadClassesFrequency == 0) return false;
61 // Randomly unload classes with 50% chance.
62 return (os::random() & 1) == 1;
63 }
64
65 const char* ShenandoahAggressiveHeuristics::name() {
66 return "aggressive";
67 }
68
69 bool ShenandoahAggressiveHeuristics::is_diagnostic() {
|
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "gc_implementation/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp"
26 #include "gc_implementation/shenandoah/shenandoahCollectionSet.hpp"
27 #include "gc_implementation/shenandoah/shenandoahHeapRegion.hpp"
28 #include "gc_implementation/shenandoah/shenandoahLogging.hpp"
29
30 ShenandoahAggressiveHeuristics::ShenandoahAggressiveHeuristics() : ShenandoahHeuristics() {
31 // Do not shortcut evacuation
32 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100);
33
34 // Aggressive runs with max speed for allocation, to capture races against mutator
35 SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahPacing);
36
37 // Aggressive evacuates everything, so it needs as much evac space as it can get
38 SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahEvacReserveOverflow);
39
40 // If class unloading is globally enabled, aggressive does unloading even with
41 // concurrent cycles.
42 if (ClassUnloading) {
43 SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUnloadClassesFrequency, 1);
44 }
45 }
46
47 void ShenandoahAggressiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
48 RegionData* data, size_t size,
49 size_t free) {
50 for (size_t idx = 0; idx < size; idx++) {
51 ShenandoahHeapRegion* r = data[idx]._region;
52 if (r->garbage() > 0) {
53 cset->add_region(r);
54 }
55 }
56 }
57
58 bool ShenandoahAggressiveHeuristics::should_start_normal_gc() const {
59 log_info(gc)("Trigger: Start next cycle immediately");
60 return true;
61 }
62
63 bool ShenandoahAggressiveHeuristics::should_process_references() {
64 if (ShenandoahRefProcFrequency == 0) return false;
65 // Randomly process refs with 50% chance.
66 return (os::random() & 1) == 1;
67 }
68
69 bool ShenandoahAggressiveHeuristics::should_unload_classes() {
70 if (ShenandoahUnloadClassesFrequency == 0) return false;
71 // Randomly unload classes with 50% chance.
72 return (os::random() & 1) == 1;
73 }
74
75 const char* ShenandoahAggressiveHeuristics::name() {
76 return "aggressive";
77 }
78
79 bool ShenandoahAggressiveHeuristics::is_diagnostic() {
|