26 #include "gc/shared/gcConfig.hpp"
27 #include "runtime/globals_extension.hpp"
28 #include "runtime/java.hpp"
29 #include "runtime/os.hpp"
30 #include "utilities/macros.hpp"
31 #if INCLUDE_CMSGC
32 #include "gc/cms/cmsArguments.hpp"
33 #endif
34 #if INCLUDE_EPSILONGC
35 #include "gc/epsilon/epsilonArguments.hpp"
36 #endif
37 #if INCLUDE_G1GC
38 #include "gc/g1/g1Arguments.hpp"
39 #endif
40 #if INCLUDE_PARALLELGC
41 #include "gc/parallel/parallelArguments.hpp"
42 #endif
43 #if INCLUDE_SERIALGC
44 #include "gc/serial/serialArguments.hpp"
45 #endif
46 #if INCLUDE_ZGC
47 #include "gc/z/zArguments.hpp"
48 #endif
49
50 struct SupportedGC {
51 bool& _flag;
52 CollectedHeap::Name _name;
53 GCArguments& _arguments;
54 const char* _hs_err_name;
55
56 SupportedGC(bool& flag, CollectedHeap::Name name, GCArguments& arguments, const char* hs_err_name) :
57 _flag(flag), _name(name), _arguments(arguments), _hs_err_name(hs_err_name) {}
58 };
59
60 CMSGC_ONLY(static CMSArguments cmsArguments;)
61 EPSILONGC_ONLY(static EpsilonArguments epsilonArguments;)
62 G1GC_ONLY(static G1Arguments g1Arguments;)
63 PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
64 SERIALGC_ONLY(static SerialArguments serialArguments;)
65 ZGC_ONLY(static ZArguments zArguments;)
66
67 // Table of supported GCs, for translating between command
68 // line flag, CollectedHeap::Name and GCArguments instance.
69 static const SupportedGC SupportedGCs[] = {
70 CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS, cmsArguments, "concurrent mark sweep gc"))
71 EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC, CollectedHeap::Epsilon, epsilonArguments, "epsilon gc"))
72 G1GC_ONLY_ARG(SupportedGC(UseG1GC, CollectedHeap::G1, g1Arguments, "g1 gc"))
73 PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
74 PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
75 SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC, CollectedHeap::Serial, serialArguments, "serial gc"))
76 ZGC_ONLY_ARG(SupportedGC(UseZGC, CollectedHeap::Z, zArguments, "z gc"))
77 };
78
79 #define FOR_EACH_SUPPORTED_GC(var) \
80 for (const SupportedGC* var = &SupportedGCs[0]; var < &SupportedGCs[ARRAY_SIZE(SupportedGCs)]; var++)
81
82 #define FAIL_IF_SELECTED(option, enabled) \
83 if (option == enabled && FLAG_IS_CMDLINE(option)) { \
84 vm_exit_during_initialization(enabled ? \
85 "Option -XX:+" #option " not supported" : \
86 "Option -XX:-" #option " not supported"); \
87 }
88
89 GCArguments* GCConfig::_arguments = NULL;
90 bool GCConfig::_gc_selected_ergonomically = false;
91
92 void GCConfig::fail_if_unsupported_gc_is_selected() {
93 NOT_CMSGC( FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
94 NOT_EPSILONGC( FAIL_IF_SELECTED(UseEpsilonGC, true));
95 NOT_G1GC( FAIL_IF_SELECTED(UseG1GC, true));
96 NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelGC, true));
97 NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelOldGC, true));
98 NOT_SERIALGC( FAIL_IF_SELECTED(UseSerialGC, true));
99 NOT_SERIALGC( FAIL_IF_SELECTED(UseParallelOldGC, false));
100 NOT_ZGC( FAIL_IF_SELECTED(UseZGC, true));
101 }
102
103 void GCConfig::select_gc_ergonomically() {
104 if (os::is_server_class_machine()) {
105 #if INCLUDE_G1GC
106 FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
107 #elif INCLUDE_PARALLELGC
108 FLAG_SET_ERGO_IF_DEFAULT(bool, UseParallelGC, true);
109 #elif INCLUDE_SERIALGC
110 FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
111 #endif
112 } else {
113 #if INCLUDE_SERIALGC
114 FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
115 #endif
116 }
117 }
118
119 bool GCConfig::is_no_gc_selected() {
|
26 #include "gc/shared/gcConfig.hpp"
27 #include "runtime/globals_extension.hpp"
28 #include "runtime/java.hpp"
29 #include "runtime/os.hpp"
30 #include "utilities/macros.hpp"
31 #if INCLUDE_CMSGC
32 #include "gc/cms/cmsArguments.hpp"
33 #endif
34 #if INCLUDE_EPSILONGC
35 #include "gc/epsilon/epsilonArguments.hpp"
36 #endif
37 #if INCLUDE_G1GC
38 #include "gc/g1/g1Arguments.hpp"
39 #endif
40 #if INCLUDE_PARALLELGC
41 #include "gc/parallel/parallelArguments.hpp"
42 #endif
43 #if INCLUDE_SERIALGC
44 #include "gc/serial/serialArguments.hpp"
45 #endif
46 #if INCLUDE_SHENANDOAHGC
47 #include "gc/shenandoah/shenandoahArguments.hpp"
48 #endif
49 #if INCLUDE_ZGC
50 #include "gc/z/zArguments.hpp"
51 #endif
52
53 struct SupportedGC {
54 bool& _flag;
55 CollectedHeap::Name _name;
56 GCArguments& _arguments;
57 const char* _hs_err_name;
58
59 SupportedGC(bool& flag, CollectedHeap::Name name, GCArguments& arguments, const char* hs_err_name) :
60 _flag(flag), _name(name), _arguments(arguments), _hs_err_name(hs_err_name) {}
61 };
62
63 CMSGC_ONLY(static CMSArguments cmsArguments;)
64 EPSILONGC_ONLY(static EpsilonArguments epsilonArguments;)
65 G1GC_ONLY(static G1Arguments g1Arguments;)
66 PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
67 SERIALGC_ONLY(static SerialArguments serialArguments;)
68 SHENANDOAHGC_ONLY(static ShenandoahArguments shenandoahArguments;)
69 ZGC_ONLY(static ZArguments zArguments;)
70
71 // Table of supported GCs, for translating between command
72 // line flag, CollectedHeap::Name and GCArguments instance.
73 static const SupportedGC SupportedGCs[] = {
74 CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS, cmsArguments, "concurrent mark sweep gc"))
75 EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC, CollectedHeap::Epsilon, epsilonArguments, "epsilon gc"))
76 G1GC_ONLY_ARG(SupportedGC(UseG1GC, CollectedHeap::G1, g1Arguments, "g1 gc"))
77 PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
78 PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
79 SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC, CollectedHeap::Serial, serialArguments, "serial gc"))
80 SHENANDOAHGC_ONLY_ARG(SupportedGC(UseShenandoahGC, CollectedHeap::Shenandoah, shenandoahArguments, "shenandoah gc"))
81 ZGC_ONLY_ARG(SupportedGC(UseZGC, CollectedHeap::Z, zArguments, "z gc"))
82 };
83
84 #define FOR_EACH_SUPPORTED_GC(var) \
85 for (const SupportedGC* var = &SupportedGCs[0]; var < &SupportedGCs[ARRAY_SIZE(SupportedGCs)]; var++)
86
87 #define FAIL_IF_SELECTED(option, enabled) \
88 if (option == enabled && FLAG_IS_CMDLINE(option)) { \
89 vm_exit_during_initialization(enabled ? \
90 "Option -XX:+" #option " not supported" : \
91 "Option -XX:-" #option " not supported"); \
92 }
93
94 GCArguments* GCConfig::_arguments = NULL;
95 bool GCConfig::_gc_selected_ergonomically = false;
96
97 void GCConfig::fail_if_unsupported_gc_is_selected() {
98 NOT_CMSGC( FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
99 NOT_EPSILONGC( FAIL_IF_SELECTED(UseEpsilonGC, true));
100 NOT_G1GC( FAIL_IF_SELECTED(UseG1GC, true));
101 NOT_PARALLELGC( FAIL_IF_SELECTED(UseParallelGC, true));
102 NOT_PARALLELGC( FAIL_IF_SELECTED(UseParallelOldGC, true));
103 NOT_SERIALGC( FAIL_IF_SELECTED(UseSerialGC, true));
104 NOT_SERIALGC( FAIL_IF_SELECTED(UseParallelOldGC, false));
105 NOT_SHENANDOAHGC(FAIL_IF_SELECTED(UseShenandoahGC, true));
106 NOT_ZGC( FAIL_IF_SELECTED(UseZGC, true));
107 }
108
109 void GCConfig::select_gc_ergonomically() {
110 if (os::is_server_class_machine()) {
111 #if INCLUDE_G1GC
112 FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
113 #elif INCLUDE_PARALLELGC
114 FLAG_SET_ERGO_IF_DEFAULT(bool, UseParallelGC, true);
115 #elif INCLUDE_SERIALGC
116 FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
117 #endif
118 } else {
119 #if INCLUDE_SERIALGC
120 FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
121 #endif
122 }
123 }
124
125 bool GCConfig::is_no_gc_selected() {
|