--- a/src/hotspot/share/gc/shared/gcConfig.cpp Thu May 03 22:30:08 2018 +0200
+++ b/src/hotspot/share/gc/shared/gcConfig.cpp Fri May 04 19:16:56 2018 +0200
@@ -23,17 +23,26 @@
*/
#include "precompiled.hpp"
-#include "gc/serial/serialArguments.hpp"
#include "gc/shared/gcConfig.hpp"
+#include "runtime/globals_extension.hpp"
#include "runtime/java.hpp"
#include "runtime/os.hpp"
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
-#include "gc/parallel/parallelArguments.hpp"
+#if INCLUDE_CMSGC
#include "gc/cms/cmsArguments.hpp"
+#endif
+#if INCLUDE_G1GC
#include "gc/g1/g1Arguments.hpp"
+#endif
+#if INCLUDE_PARALLELGC
+#include "gc/parallel/parallelArguments.hpp"
+#endif
+#if INCLUDE_SERIALGC
+#include "gc/serial/serialArguments.hpp"
+#endif
+#if INCLUDE_EPSILONGC
#include "gc/epsilon/epsilonArguments.hpp"
-#endif // INCLUDE_ALL_GCS
+#endif
struct SupportedGC {
bool& _flag;
@@ -45,25 +54,21 @@
_flag(flag), _name(name), _arguments(arguments), _hs_err_name(hs_err_name) {}
};
-static SerialArguments serialArguments;
-#if INCLUDE_ALL_GCS
-static ParallelArguments parallelArguments;
-static CMSArguments cmsArguments;
-static G1Arguments g1Arguments;
-static EpsilonArguments epsilonArguments;
-#endif // INCLUDE_ALL_GCS
+ CMSGC_ONLY(static CMSArguments cmsArguments;)
+ G1GC_ONLY(static G1Arguments g1Arguments;)
+PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
+ SERIALGC_ONLY(static SerialArguments serialArguments;)
+ EPSILONGC_ONLY(static EpsilonArguments epsilonArguments;)
// Table of supported GCs, for translating between command
// line flag, CollectedHeap::Name and GCArguments instance.
static const SupportedGC SupportedGCs[] = {
- SupportedGC(UseSerialGC, CollectedHeap::Serial, serialArguments, "serial gc"),
-#if INCLUDE_ALL_GCS
- SupportedGC(UseParallelGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"),
- SupportedGC(UseParallelOldGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"),
- SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS, cmsArguments, "concurrent mark sweep gc"),
- SupportedGC(UseG1GC, CollectedHeap::G1, g1Arguments, "g1 gc"),
- SupportedGC(UseEpsilonGC, CollectedHeap::Epsilon, epsilonArguments, "epsilon gc"),
-#endif // INCLUDE_ALL_GCS
+ CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS, cmsArguments, "concurrent mark sweep gc"))
+ G1GC_ONLY_ARG(SupportedGC(UseG1GC, CollectedHeap::G1, g1Arguments, "g1 gc"))
+ PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
+ PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC, CollectedHeap::Parallel, parallelArguments, "parallel gc"))
+ SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC, CollectedHeap::Serial, serialArguments, "serial gc"))
+ EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC, CollectedHeap::Epsilon, epsilonArguments, "epsilon gc"))
};
#define FOR_EACH_SUPPORTED_GC(var) \
@@ -73,19 +78,26 @@
bool GCConfig::_gc_selected_ergonomically = false;
void GCConfig::select_gc_ergonomically() {
-#if INCLUDE_ALL_GCS
if (os::is_server_class_machine()) {
+#if INCLUDE_G1GC
FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
+#elif INCLUDE_PARALLELGC
+ FLAG_SET_ERGO_IF_DEFAULT(bool, UseParallelGC, true);
+#elif INCLUDE_SERIALGC
+ FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
+#endif
} else {
+#if INCLUDE_SERIALGC
FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
+#endif
}
-#else
- UNSUPPORTED_OPTION(UseG1GC);
- UNSUPPORTED_OPTION(UseParallelGC);
- UNSUPPORTED_OPTION(UseParallelOldGC);
- UNSUPPORTED_OPTION(UseConcMarkSweepGC);
- FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
-#endif // INCLUDE_ALL_GCS
+
+ NOT_CMSGC( UNSUPPORTED_OPTION(UseConcMarkSweepGC));
+ NOT_G1GC( UNSUPPORTED_OPTION(UseG1GC);)
+ NOT_PARALLELGC(UNSUPPORTED_OPTION(UseParallelGC);)
+ NOT_PARALLELGC(UNSUPPORTED_OPTION(UseParallelOldGC));
+ NOT_SERIALGC( UNSUPPORTED_OPTION(UseSerialGC);)
+ NOT_EPSILONGC( UNSUPPORTED_OPTION(UseEpsilonGC);)
}
bool GCConfig::is_no_gc_selected() {
@@ -131,17 +143,25 @@
_gc_selected_ergonomically = true;
}
- if (is_exactly_one_gc_selected()) {
- // Exacly one GC selected
- FOR_EACH_SUPPORTED_GC(gc) {
- if (gc->_flag) {
- return &gc->_arguments;
- }
+ if (!is_exactly_one_gc_selected()) {
+ // More than one GC selected
+ vm_exit_during_initialization("Multiple garbage collectors selected", NULL);
+ }
+
+#if INCLUDE_PARALLELGC && !INCLUDE_SERIALGC
+ if (FLAG_IS_CMDLINE(UseParallelOldGC) && !UseParallelOldGC) {
+ vm_exit_during_initialization("This JVM build only supports UseParallelOldGC as the full GC");
+ }
+#endif
+
+ // Exactly one GC selected
+ FOR_EACH_SUPPORTED_GC(gc) {
+ if (gc->_flag) {
+ return &gc->_arguments;
}
}
- // More than one GC selected
- vm_exit_during_initialization("Multiple garbage collectors selected", NULL);
+ fatal("Should have found the selected GC");
return NULL;
}