6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "runtime/arguments.hpp"
27 #include "runtime/commandLineFlagConstraintsGC.hpp"
28 #include "runtime/commandLineFlagRangeList.hpp"
29 #include "runtime/globals.hpp"
30 #include "utilities/defaultStream.hpp"
31
32 #if INCLUDE_ALL_GCS
33 #include "gc/g1/g1_globals.hpp"
34 #include "gc/g1/heapRegionBounds.inline.hpp"
35 #include "gc/parallel/parallelScavengeHeap.hpp"
36 #include "gc/shared/plab.hpp"
37 #endif // INCLUDE_ALL_GCS
38 #ifdef COMPILER1
39 #include "c1/c1_globals.hpp"
40 #endif // COMPILER1
41 #ifdef COMPILER2
42 #include "opto/c2_globals.hpp"
43 #endif // COMPILER2
44
45 static Flag::Error MinPLABSizeBounds(const char* name, size_t value, bool verbose) {
46 #if INCLUDE_ALL_GCS
47 if ((UseConcMarkSweepGC || UseG1GC) && (value < PLAB::min_size())) {
48 CommandLineError::print(verbose,
49 "%s (" SIZE_FORMAT ") must be "
50 "greater than or equal to ergonomic PLAB minimum size (" SIZE_FORMAT ")\n",
51 name, value, PLAB::min_size());
52 return Flag::VIOLATES_CONSTRAINT;
53 }
54 #endif // INCLUDE_ALL_GCS
55 return Flag::SUCCESS;
56 }
57
58 static Flag::Error MaxPLABSizeBounds(const char* name, size_t value, bool verbose) {
59 #if INCLUDE_ALL_GCS
60 if ((UseConcMarkSweepGC || UseG1GC) && (value > PLAB::max_size())) {
61 CommandLineError::print(verbose,
62 "%s (" SIZE_FORMAT ") must be "
63 "less than ergonomic PLAB maximum size (" SIZE_FORMAT ")\n",
64 name, value, PLAB::min_size());
65 return Flag::VIOLATES_CONSTRAINT;
66 }
67 #endif // INCLUDE_ALL_GCS
68 return Flag::SUCCESS;
69 }
70
71 static Flag::Error MinMaxPLABSizeBounds(const char* name, size_t value, bool verbose) {
72 if (MinPLABSizeBounds(name, value, verbose) == Flag::SUCCESS) {
73 return MaxPLABSizeBounds(name, value, verbose);
74 }
75 return Flag::VIOLATES_CONSTRAINT;
76 }
77
78 Flag::Error YoungPLABSizeConstraintFunc(size_t value, bool verbose) {
79 return MinMaxPLABSizeBounds("YoungPLABSize", value, verbose);
80 }
81
82 Flag::Error MinHeapFreeRatioConstraintFunc(uintx value, bool verbose) {
83 if (value > MaxHeapFreeRatio) {
84 CommandLineError::print(verbose,
85 "MinHeapFreeRatio (" UINTX_FORMAT ") must be "
86 "less than or equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n",
87 value, MaxHeapFreeRatio);
88 return Flag::VIOLATES_CONSTRAINT;
89 } else {
90 return Flag::SUCCESS;
91 }
92 }
93
94 Flag::Error MaxHeapFreeRatioConstraintFunc(uintx value, bool verbose) {
95 if (value < MinHeapFreeRatio) {
96 CommandLineError::print(verbose,
97 "MaxHeapFreeRatio (" UINTX_FORMAT ") must be "
98 "greater than or equal to MinHeapFreeRatio (" UINTX_FORMAT ")\n",
99 value, MinHeapFreeRatio);
100 return Flag::VIOLATES_CONSTRAINT;
101 } else {
102 return Flag::SUCCESS;
103 }
104 }
105
106 Flag::Error MinMetaspaceFreeRatioConstraintFunc(uintx value, bool verbose) {
107 if (value > MaxMetaspaceFreeRatio) {
108 CommandLineError::print(verbose,
109 "MinMetaspaceFreeRatio (" UINTX_FORMAT ") must be "
110 "less than or equal to MaxMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
111 value, MaxMetaspaceFreeRatio);
112 return Flag::VIOLATES_CONSTRAINT;
113 } else {
114 return Flag::SUCCESS;
115 }
116 }
117
118 Flag::Error MaxMetaspaceFreeRatioConstraintFunc(uintx value, bool verbose) {
119 if (value < MinMetaspaceFreeRatio) {
120 CommandLineError::print(verbose,
121 "MaxMetaspaceFreeRatio (" UINTX_FORMAT ") must be "
122 "greater than or equal to MinMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
123 value, MinMetaspaceFreeRatio);
124 return Flag::VIOLATES_CONSTRAINT;
125 } else {
126 return Flag::SUCCESS;
127 }
128 }
129
130 // GC workaround for "-XX:+UseConcMarkSweepGC"
131 // which sets InitialTenuringThreshold to 7 but leaves MaxTenuringThreshold remaining at 6
132 // and therefore would invalidate the constraint
133 #define UseConcMarkSweepGCWorkaroundIfNeeded(initial, max) { \
134 if ((initial == 7) && (max == 6)) { \
135 return Flag::SUCCESS; \
136 } \
137 }
138
139 Flag::Error InitialTenuringThresholdConstraintFunc(uintx value, bool verbose) {
140 UseConcMarkSweepGCWorkaroundIfNeeded(value, MaxTenuringThreshold);
141
142 if (value > MaxTenuringThreshold) {
143 CommandLineError::print(verbose,
144 "InitialTenuringThreshold (" UINTX_FORMAT ") must be "
145 "less than or equal to MaxTenuringThreshold (" UINTX_FORMAT ")\n",
146 value, MaxTenuringThreshold);
147 return Flag::VIOLATES_CONSTRAINT;
148 } else {
149 return Flag::SUCCESS;
150 }
151 }
152
153 Flag::Error MaxTenuringThresholdConstraintFunc(uintx value, bool verbose) {
154 UseConcMarkSweepGCWorkaroundIfNeeded(InitialTenuringThreshold, value);
155
156 if (value < InitialTenuringThreshold) {
157 CommandLineError::print(verbose,
158 "MaxTenuringThreshold (" UINTX_FORMAT ") must be "
159 "greater than or equal to InitialTenuringThreshold (" UINTX_FORMAT ")\n",
160 value, InitialTenuringThreshold);
161 return Flag::VIOLATES_CONSTRAINT;
162 } else {
163 return Flag::SUCCESS;
164 }
165 }
166
167 #if INCLUDE_ALL_GCS
168 Flag::Error G1NewSizePercentConstraintFunc(uintx value, bool verbose) {
169 if (value > G1MaxNewSizePercent) {
170 CommandLineError::print(verbose,
171 "G1NewSizePercent (" UINTX_FORMAT ") must be "
172 "less than or equal to G1MaxNewSizePercent (" UINTX_FORMAT ")\n",
173 value, G1MaxNewSizePercent);
174 return Flag::VIOLATES_CONSTRAINT;
175 } else {
176 return Flag::SUCCESS;
177 }
178 }
179
180 Flag::Error G1MaxNewSizePercentConstraintFunc(uintx value, bool verbose) {
181 if (value < G1NewSizePercent) {
182 CommandLineError::print(verbose,
183 "G1MaxNewSizePercent (" UINTX_FORMAT ") must be "
184 "greater than or equal to G1NewSizePercent (" UINTX_FORMAT ")\n",
185 value, G1NewSizePercent);
186 return Flag::VIOLATES_CONSTRAINT;
187 } else {
188 return Flag::SUCCESS;
189 }
190 }
191
192 #endif // INCLUDE_ALL_GCS
193
194 Flag::Error CMSOldPLABMinConstraintFunc(size_t value, bool verbose) {
195 if (value > CMSOldPLABMax) {
196 CommandLineError::print(verbose,
197 "CMSOldPLABMin (" SIZE_FORMAT ") must be "
198 "less than or equal to CMSOldPLABMax (" SIZE_FORMAT ")\n",
199 value, CMSOldPLABMax);
200 return Flag::VIOLATES_CONSTRAINT;
201 } else {
202 return Flag::SUCCESS;
203 }
204 }
205
206 Flag::Error CMSPrecleanDenominatorConstraintFunc(uintx value, bool verbose) {
207 if (value <= CMSPrecleanNumerator) {
208 CommandLineError::print(verbose,
209 "CMSPrecleanDenominator (" UINTX_FORMAT ") must be "
210 "strickly greater than CMSPrecleanNumerator (" UINTX_FORMAT ")\n",
211 value, CMSPrecleanNumerator);
212 return Flag::VIOLATES_CONSTRAINT;
213 } else {
214 return Flag::SUCCESS;
215 }
216 }
217
218 Flag::Error CMSPrecleanNumeratorConstraintFunc(uintx value, bool verbose) {
219 if (value > (CMSPrecleanDenominator - 1)) {
220 CommandLineError::print(verbose,
221 "CMSPrecleanNumerator (" UINTX_FORMAT ") must be "
222 "less than or equal to CMSPrecleanDenominator - 1 (" UINTX_FORMAT ")\n",
223 value, CMSPrecleanDenominator - 1);
224 return Flag::VIOLATES_CONSTRAINT;
225 } else {
226 return Flag::SUCCESS;
227 }
228 }
229
230 Flag::Error SurvivorAlignmentInBytesConstraintFunc(intx value, bool verbose) {
231 if (value != 0) {
232 if (!is_power_of_2(value)) {
233 CommandLineError::print(verbose,
234 "SurvivorAlignmentInBytes (" INTX_FORMAT ") must be "
235 "power of 2\n",
236 value);
237 return Flag::VIOLATES_CONSTRAINT;
238 }
239 if (value < ObjectAlignmentInBytes) {
240 CommandLineError::print(verbose,
241 "SurvivorAlignmentInBytes (" INTX_FORMAT ") must be "
242 "greater than or equal to ObjectAlignmentInBytes (" INTX_FORMAT ")\n",
243 value, ObjectAlignmentInBytes);
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc/shared/collectedHeap.hpp"
27 #include "gc/shared/collectorPolicy.hpp"
28 #include "gc/shared/threadLocalAllocBuffer.hpp"
29 #include "runtime/arguments.hpp"
30 #include "runtime/commandLineFlagConstraintsGC.hpp"
31 #include "runtime/commandLineFlagRangeList.hpp"
32 #include "runtime/globals.hpp"
33 #include "runtime/globals_extension.hpp"
34 #include "utilities/defaultStream.hpp"
35
36 #if INCLUDE_ALL_GCS
37 #include "gc/g1/g1_globals.hpp"
38 #include "gc/g1/heapRegionBounds.inline.hpp"
39 #include "gc/shared/plab.hpp"
40 #endif // INCLUDE_ALL_GCS
41 #ifdef COMPILER1
42 #include "c1/c1_globals.hpp"
43 #endif // COMPILER1
44 #ifdef COMPILER2
45 #include "opto/c2_globals.hpp"
46 #endif // COMPILER2
47
48 #if INCLUDE_ALL_GCS
49 static Flag::Error ParallelGCThreadsAndCMSWorkQueueDrainThreshold(uint threads, uintx threshold, bool verbose) {
50 // CMSWorkQueueDrainThreshold is verified to be less than max_juint
51 if (UseConcMarkSweepGC && (threads > (uint)(max_jint / (uint)threshold))) {
52 CommandLineError::print(verbose,
53 "ParallelGCThreads (" UINT32_FORMAT ") or CMSWorkQueueDrainThreshold ("
54 UINTX_FORMAT ") is too large\n",
55 threads, threshold);
56 return Flag::VIOLATES_CONSTRAINT;
57 }
58 return Flag::SUCCESS;
59 }
60 #endif
61
62 // As ParallelGCThreads differs among GC modes, we need constraint function.
63 Flag::Error ParallelGCThreadsConstraintFunc(uint value, bool verbose) {
64 Flag::Error status = Flag::SUCCESS;
65
66 #if INCLUDE_ALL_GCS
67 // Parallel GC passes ParallelGCThreads when creating GrowableArray as 'int' type parameter.
68 // So can't exceed with "max_jint"
69 if (UseParallelGC && (value > (uint)max_jint)) {
70 CommandLineError::print(verbose,
71 "ParallelGCThreads (" UINT32_FORMAT ") must be less than or equal to "
72 UINT32_FORMAT " for Parallel GC\n",
73 value, max_jint);
74 return Flag::VIOLATES_CONSTRAINT;
75 }
76 // To avoid overflow at ParScanClosure::do_oop_work.
77 if (UseConcMarkSweepGC && (value > max_jint / 10)) {
78 CommandLineError::print(verbose,
79 "ParallelGCThreads (" UINT32_FORMAT ") must be less than or equal to "
80 UINT32_FORMAT " for CMS GC\n",
81 value, max_jint / 10);
82 return Flag::VIOLATES_CONSTRAINT;
83 }
84 status = ParallelGCThreadsAndCMSWorkQueueDrainThreshold(value, CMSWorkQueueDrainThreshold, verbose);
85 #endif
86 return status;
87 }
88
89 // As ConcGCThreads should be smaller than ParallelGCThreads,
90 // we need constraint function.
91 Flag::Error ConcGCThreadsConstraintFunc(uint value, bool verbose) {
92 #if INCLUDE_ALL_GCS
93 // CMS and G1 GCs use ConcGCThreads.
94 if ((UseConcMarkSweepGC || UseG1GC) && (value > ParallelGCThreads)) {
95 CommandLineError::print(verbose,
96 "ConcGCThreads (" UINT32_FORMAT ") must be less than or equal to "
97 "ParallelGCThreads (" UINT32_FORMAT ")\n",
98 value, ParallelGCThreads);
99 return Flag::VIOLATES_CONSTRAINT;
100 }
101 #endif
102 return Flag::SUCCESS;
103 }
104
105 static Flag::Error MinPLABSizeBounds(const char* name, size_t value, bool verbose) {
106 #if INCLUDE_ALL_GCS
107 if ((UseConcMarkSweepGC || UseG1GC) && (value < PLAB::min_size())) {
108 CommandLineError::print(verbose,
109 "%s (" SIZE_FORMAT ") must be "
110 "greater than or equal to ergonomic PLAB minimum size (" SIZE_FORMAT ")\n",
111 name, value, PLAB::min_size());
112 return Flag::VIOLATES_CONSTRAINT;
113 }
114 #endif // INCLUDE_ALL_GCS
115 return Flag::SUCCESS;
116 }
117
118 static Flag::Error MaxPLABSizeBounds(const char* name, size_t value, bool verbose) {
119 #if INCLUDE_ALL_GCS
120 if ((UseConcMarkSweepGC || UseG1GC) && (value > PLAB::max_size())) {
121 CommandLineError::print(verbose,
122 "%s (" SIZE_FORMAT ") must be "
123 "less than or equal to ergonomic PLAB maximum size (" SIZE_FORMAT ")\n",
124 name, value, PLAB::min_size());
125 return Flag::VIOLATES_CONSTRAINT;
126 }
127 #endif // INCLUDE_ALL_GCS
128 return Flag::SUCCESS;
129 }
130
131 static Flag::Error MinMaxPLABSizeBounds(const char* name, size_t value, bool verbose) {
132 Flag::Error status = MinPLABSizeBounds(name, value, verbose);
133
134 if (status == Flag::SUCCESS) {
135 return MaxPLABSizeBounds(name, value, verbose);
136 }
137 return status;
138 }
139
140 Flag::Error YoungPLABSizeConstraintFunc(size_t value, bool verbose) {
141 return MinMaxPLABSizeBounds("YoungPLABSize", value, verbose);
142 }
143
144 Flag::Error OldPLABSizeConstraintFunc(size_t value, bool verbose) {
145 Flag::Error status = Flag::SUCCESS;
146
147 #if INCLUDE_ALL_GCS
148 if (UseConcMarkSweepGC) {
149 if (value == 0) {
150 CommandLineError::print(verbose,
151 "OldPLABSize (" SIZE_FORMAT ") must be greater than 0",
152 value);
153 return Flag::VIOLATES_CONSTRAINT;
154 }
155 // For CMS, OldPLABSize is the number of free blocks of a given size that are used when
156 // replenishing the local per-worker free list caches.
157 // For more details, please refer to Arguments::set_cms_and_parnew_gc_flags().
158 status = MaxPLABSizeBounds("OldPLABSize", value, verbose);
159 } else {
160 status = MinMaxPLABSizeBounds("OldPLABSize", value, verbose);
161 }
162 #endif
163 return status;
164 }
165
166 Flag::Error MinHeapFreeRatioConstraintFunc(uintx value, bool verbose) {
167 if (value > MaxHeapFreeRatio) {
168 CommandLineError::print(verbose,
169 "MinHeapFreeRatio (" UINTX_FORMAT ") must be "
170 "less than or equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n",
171 value, MaxHeapFreeRatio);
172 return Flag::VIOLATES_CONSTRAINT;
173 } else {
174 return Flag::SUCCESS;
175 }
176 }
177
178 Flag::Error MaxHeapFreeRatioConstraintFunc(uintx value, bool verbose) {
179 if (value < MinHeapFreeRatio) {
180 CommandLineError::print(verbose,
181 "MaxHeapFreeRatio (" UINTX_FORMAT ") must be "
182 "greater than or equal to MinHeapFreeRatio (" UINTX_FORMAT ")\n",
183 value, MinHeapFreeRatio);
184 return Flag::VIOLATES_CONSTRAINT;
185 } else {
186 return Flag::SUCCESS;
187 }
188 }
189
190 static Flag::Error CheckMaxHeapSizeAndSoftRefLRUPolicyMSPerMB(size_t maxHeap, intx softRef, bool verbose) {
191 if ((softRef > 0) && (maxHeap / M > max_uintx / softRef)) {
192 CommandLineError::print(verbose,
193 "MaxHeapSize (" SIZE_FORMAT ") or SoftRefLRUPolicyMSPerMB "
194 "(" INTX_FORMAT ") is too large\n",
195 maxHeap, softRef);
196 return Flag::VIOLATES_CONSTRAINT;
197 } else {
198 return Flag::SUCCESS;
199 }
200 }
201
202 Flag::Error SoftRefLRUPolicyMSPerMBConstraintFunc(intx value, bool verbose) {
203 return CheckMaxHeapSizeAndSoftRefLRUPolicyMSPerMB(MaxHeapSize, value, verbose);
204 }
205
206 Flag::Error MinMetaspaceFreeRatioConstraintFunc(uintx value, bool verbose) {
207 if (value > MaxMetaspaceFreeRatio) {
208 CommandLineError::print(verbose,
209 "MinMetaspaceFreeRatio (" UINTX_FORMAT ") must be "
210 "less than or equal to MaxMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
211 value, MaxMetaspaceFreeRatio);
212 return Flag::VIOLATES_CONSTRAINT;
213 } else {
214 return Flag::SUCCESS;
215 }
216 }
217
218 Flag::Error MaxMetaspaceFreeRatioConstraintFunc(uintx value, bool verbose) {
219 if (value < MinMetaspaceFreeRatio) {
220 CommandLineError::print(verbose,
221 "MaxMetaspaceFreeRatio (" UINTX_FORMAT ") must be "
222 "greater than or equal to MinMetaspaceFreeRatio (" UINTX_FORMAT ")\n",
223 value, MinMetaspaceFreeRatio);
224 return Flag::VIOLATES_CONSTRAINT;
225 } else {
226 return Flag::SUCCESS;
227 }
228 }
229
230 Flag::Error InitialTenuringThresholdConstraintFunc(uintx value, bool verbose) {
231 #if INCLUDE_ALL_GCS
232 // InitialTenuringThreshold is only used for ParallelGC.
233 if (UseParallelGC && (value > MaxTenuringThreshold)) {
234 CommandLineError::print(verbose,
235 "InitialTenuringThreshold (" UINTX_FORMAT ") must be "
236 "less than or equal to MaxTenuringThreshold (" UINTX_FORMAT ")\n",
237 value, MaxTenuringThreshold);
238 return Flag::VIOLATES_CONSTRAINT;
239 }
240 #endif
241 return Flag::SUCCESS;
242 }
243
244 Flag::Error MaxTenuringThresholdConstraintFunc(uintx value, bool verbose) {
245 #if INCLUDE_ALL_GCS
246 // As only ParallelGC uses InitialTenuringThreshold,
247 // we don't need to compare InitialTenuringThreshold with MaxTenuringThreshold.
248 if (UseParallelGC && (value < InitialTenuringThreshold)) {
249 CommandLineError::print(verbose,
250 "MaxTenuringThreshold (" UINTX_FORMAT ") must be "
251 "greater than or equal to InitialTenuringThreshold (" UINTX_FORMAT ")\n",
252 value, InitialTenuringThreshold);
253 return Flag::VIOLATES_CONSTRAINT;
254 }
255 #endif
256
257 // MaxTenuringThreshold=0 means NeverTenure=false && AlwaysTenure=true
258 if ((value == 0) && (NeverTenure || !AlwaysTenure)) {
259 CommandLineError::print(verbose,
260 "MaxTenuringThreshold (0) should match to NeverTenure=false "
261 "&& AlwaysTenure=true. But we have NeverTenure=%s "
262 "AlwaysTenure=%s\n",
263 NeverTenure ? "true" : "false",
264 AlwaysTenure ? "true" : "false");
265 return Flag::VIOLATES_CONSTRAINT;
266 }
267 return Flag::SUCCESS;
268 }
269
270 #if INCLUDE_ALL_GCS
271 Flag::Error G1RSetRegionEntriesConstraintFunc(intx value, bool verbose) {
272 if (!UseG1GC) return Flag::SUCCESS;
273
274 // Default value of G1RSetRegionEntries=0 means will be set ergonomically.
275 // Minimum value is 1.
276 if (FLAG_IS_CMDLINE(G1RSetRegionEntries) && (value < 1)) {
277 CommandLineError::print(verbose,
278 "G1RSetRegionEntries (" INTX_FORMAT ") must be "
279 "greater than or equal to 1\n",
280 value);
281 return Flag::VIOLATES_CONSTRAINT;
282 } else {
283 return Flag::SUCCESS;
284 }
285 }
286
287 Flag::Error G1RSetSparseRegionEntriesConstraintFunc(intx value, bool verbose) {
288 if (!UseG1GC) return Flag::SUCCESS;
289
290 // Default value of G1RSetSparseRegionEntries=0 means will be set ergonomically.
291 // Minimum value is 1.
292 if (FLAG_IS_CMDLINE(G1RSetSparseRegionEntries) && (value < 1)) {
293 CommandLineError::print(verbose,
294 "G1RSetSparseRegionEntries (" INTX_FORMAT ") must be "
295 "greater than or equal to 1\n",
296 value);
297 return Flag::VIOLATES_CONSTRAINT;
298 } else {
299 return Flag::SUCCESS;
300 }
301 }
302
303 Flag::Error G1YoungSurvRateNumRegionsSummaryConstraintFunc(intx value, bool verbose) {
304 if (!UseG1GC) return Flag::SUCCESS;
305
306 if (value > (intx)HeapRegionBounds::target_number()) {
307 CommandLineError::print(verbose,
308 "G1YoungSurvRateNumRegionsSummary (" INTX_FORMAT ") must be less than "
309 "or equal to region amount (" SIZE_FORMAT ")\n",
310 value, HeapRegionBounds::target_number());
311 return Flag::VIOLATES_CONSTRAINT;
312 } else {
313 return Flag::SUCCESS;
314 }
315 }
316
317 Flag::Error G1HeapRegionSizeConstraintFunc(size_t value, bool verbose) {
318 if (!UseG1GC) return Flag::SUCCESS;
319
320 // Default value of G1HeapRegionSize=0 means will be set ergonomically.
321 if (FLAG_IS_CMDLINE(G1HeapRegionSize) && (value < HeapRegionBounds::min_size())) {
322 CommandLineError::print(verbose,
323 "G1HeapRegionSize (" SIZE_FORMAT ") must be greater than or "
324 "equal to ergonomic heap region minimum size\n",
325 value);
326 return Flag::VIOLATES_CONSTRAINT;
327 } else {
328 return Flag::SUCCESS;
329 }
330 }
331
332 Flag::Error G1NewSizePercentConstraintFunc(uintx value, bool verbose) {
333 if (!UseG1GC) return Flag::SUCCESS;
334
335 if (value > G1MaxNewSizePercent) {
336 CommandLineError::print(verbose,
337 "G1NewSizePercent (" UINTX_FORMAT ") must be "
338 "less than or equal to G1MaxNewSizePercent (" UINTX_FORMAT ")\n",
339 value, G1MaxNewSizePercent);
340 return Flag::VIOLATES_CONSTRAINT;
341 } else {
342 return Flag::SUCCESS;
343 }
344 }
345
346 Flag::Error G1MaxNewSizePercentConstraintFunc(uintx value, bool verbose) {
347 if (!UseG1GC) return Flag::SUCCESS;
348
349 if (value < G1NewSizePercent) {
350 CommandLineError::print(verbose,
351 "G1MaxNewSizePercent (" UINTX_FORMAT ") must be "
352 "greater than or equal to G1NewSizePercent (" UINTX_FORMAT ")\n",
353 value, G1NewSizePercent);
354 return Flag::VIOLATES_CONSTRAINT;
355 } else {
356 return Flag::SUCCESS;
357 }
358 }
359 #endif // INCLUDE_ALL_GCS
360
361 Flag::Error ParGCStridesPerThreadConstraintFunc(uintx value, bool verbose) {
362 #if INCLUDE_ALL_GCS
363 if (UseConcMarkSweepGC && (value > max_jint / ParallelGCThreads)) {
364 CommandLineError::print(verbose,
365 "ParGCStridesPerThread (" UINTX_FORMAT ") must be "
366 "less than or equal to ergonomic maximum (" INT32_FORMAT ")\n",
367 value, max_jint / ParallelGCThreads);
368 return Flag::VIOLATES_CONSTRAINT;
369 }
370 #endif
371 return Flag::SUCCESS;
372 }
373
374 Flag::Error CMSOldPLABMinConstraintFunc(size_t value, bool verbose) {
375 Flag::Error status = Flag::SUCCESS;
376
377 #if INCLUDE_ALL_GCS
378 if (UseConcMarkSweepGC) {
379 if (value > CMSOldPLABMax) {
380 CommandLineError::print(verbose,
381 "CMSOldPLABMin (" SIZE_FORMAT ") must be "
382 "less than or equal to CMSOldPLABMax (" SIZE_FORMAT ")\n",
383 value, CMSOldPLABMax);
384 return Flag::VIOLATES_CONSTRAINT;
385 }
386 status = MaxPLABSizeBounds("CMSOldPLABMin", value, verbose);
387 }
388 #endif
389 return status;
390 }
391
392 Flag::Error CMSOldPLABMaxConstraintFunc(size_t value, bool verbose) {
393 Flag::Error status = Flag::SUCCESS;
394
395 #if INCLUDE_ALL_GCS
396 if (UseConcMarkSweepGC) {
397 status = MaxPLABSizeBounds("CMSOldPLABMax", value, verbose);
398 }
399 #endif
400 return status;
401 }
402
403 Flag::Error CMSPrecleanDenominatorConstraintFunc(uintx value, bool verbose) {
404 #if INCLUDE_ALL_GCS
405 if (UseConcMarkSweepGC && (value <= CMSPrecleanNumerator)) {
406 CommandLineError::print(verbose,
407 "CMSPrecleanDenominator (" UINTX_FORMAT ") must be "
408 "strickly greater than CMSPrecleanNumerator (" UINTX_FORMAT ")\n",
409 value, CMSPrecleanNumerator);
410 return Flag::VIOLATES_CONSTRAINT;
411 }
412 #endif
413 return Flag::SUCCESS;
414 }
415
416 Flag::Error CMSPrecleanNumeratorConstraintFunc(uintx value, bool verbose) {
417 #if INCLUDE_ALL_GCS
418 if (UseConcMarkSweepGC && (value >= CMSPrecleanDenominator)) {
419 CommandLineError::print(verbose,
420 "CMSPrecleanNumerator (" UINTX_FORMAT ") must be "
421 "less than CMSPrecleanDenominator (" UINTX_FORMAT ")\n",
422 value, CMSPrecleanDenominator);
423 return Flag::VIOLATES_CONSTRAINT;
424 }
425 #endif
426 return Flag::SUCCESS;
427 }
428
429 Flag::Error CMSWorkQueueDrainThresholdConstraintFunc(uintx value, bool verbose) {
430 #if INCLUDE_ALL_GCS
431 if (UseConcMarkSweepGC) {
432 return ParallelGCThreadsAndCMSWorkQueueDrainThreshold(ParallelGCThreads, value, verbose);
433 }
434 #endif
435 return Flag::SUCCESS;
436 }
437
438 Flag::Error MaxGCPauseMillisConstraintFunc(uintx value, bool verbose) {
439 #if INCLUDE_ALL_GCS
440 if (UseG1GC && FLAG_IS_CMDLINE(MaxGCPauseMillis) && (value >= GCPauseIntervalMillis)) {
441 CommandLineError::print(verbose,
442 "MaxGCPauseMillis (" UINTX_FORMAT ") must be less than "
443 "GCPauseIntervalMillis (" UINTX_FORMAT ")\n",
444 value, GCPauseIntervalMillis);
445 return Flag::VIOLATES_CONSTRAINT;
446 }
447 #endif
448
449 return Flag::SUCCESS;
450 }
451
452 Flag::Error GCPauseIntervalMillisConstraintFunc(uintx value, bool verbose) {
453 #if INCLUDE_ALL_GCS
454 if (UseG1GC) {
455 if (FLAG_IS_CMDLINE(GCPauseIntervalMillis)) {
456 if (value < 1) {
457 CommandLineError::print(verbose,
458 "GCPauseIntervalMillis (" UINTX_FORMAT ") must be greater than "
459 "or equal to 1\n",
460 value);
461 return Flag::VIOLATES_CONSTRAINT;
462 }
463 if (value <= MaxGCPauseMillis) {
464 CommandLineError::print(verbose,
465 "GCPauseIntervalMillis (" UINTX_FORMAT ") must be greater than "
466 "MaxGCPauseMillis (" UINTX_FORMAT ")\n",
467 value, MaxGCPauseMillis);
468 return Flag::VIOLATES_CONSTRAINT;
469 }
470 }
471 }
472 #endif
473 return Flag::SUCCESS;
474 }
475
476 Flag::Error InitialBootClassLoaderMetaspaceSizeConstraintFunc(size_t value, bool verbose) {
477 size_t aligned_max = (size_t)align_size_down(max_uintx/2, Metaspace::reserve_alignment_words());
478 if (value > aligned_max) {
479 CommandLineError::print(verbose,
480 "InitialBootClassLoaderMetaspaceSize (" SIZE_FORMAT ") must be less than or equal to "
481 "aligned maximum value (" SIZE_FORMAT ")\n",
482 value, aligned_max);
483 return Flag::VIOLATES_CONSTRAINT;
484 }
485 return Flag::SUCCESS;
486 }
487
488 static Flag::Error MaxSizeForHeapAlignment(const char* name, size_t value, bool verbose) {
489 // For G1 GC, we don't know until G1CollectorPolicy is created.
490 size_t heap_alignment;
491
492 #if INCLUDE_ALL_GCS
493 if (UseG1GC) {
494 heap_alignment = HeapRegionBounds::max_size();
495 } else
496 #endif
497 {
498 heap_alignment = CollectorPolicy::compute_heap_alignment();
499 }
500
501 // Not to overflow 'align_size_up(value, _heap_alignment) used from CollectorPolicy::initialize_flags()'.
502 size_t aligned_max = ((max_uintx - heap_alignment) & ~(heap_alignment-1));
503 if (value > aligned_max) {
504 CommandLineError::print(verbose,
505 "%s (" SIZE_FORMAT ") must be less than or equal to "
506 "aligned maximum value (" SIZE_FORMAT ")\n",
507 name, value, aligned_max);
508 return Flag::VIOLATES_CONSTRAINT;
509 }
510 return Flag::SUCCESS;
511 }
512
513 Flag::Error InitialHeapSizeConstraintFunc(size_t value, bool verbose) {
514 return MaxSizeForHeapAlignment("InitialHeapSize", value, verbose);
515 }
516
517 Flag::Error MaxHeapSizeConstraintFunc(size_t value, bool verbose) {
518 Flag::Error status = MaxSizeForHeapAlignment("MaxHeapSize", value, verbose);
519
520 if (status == Flag::SUCCESS) {
521 status = CheckMaxHeapSizeAndSoftRefLRUPolicyMSPerMB(value, SoftRefLRUPolicyMSPerMB, verbose);
522 }
523 return status;
524 }
525
526 Flag::Error NewSizeConstraintFunc(size_t value, bool verbose) {
527 #ifdef _LP64
528 #if INCLUDE_ALL_GCS
529 // Overflow would happen for uint type variable of YoungGenSizer::_min_desired_young_length
530 // when the value to be assigned exceeds uint range.
531 // i.e. result of '(uint)(NewSize / region size(1~32MB))'
532 // So maximum of NewSize should be 'max_juint * 1M'
533 if (UseG1GC && value > max_juint * 1 * M) {
534 CommandLineError::print(verbose,
535 "NewSize (" SIZE_FORMAT ") must be less than ergonomic maximum value\n",
536 value);
537 return Flag::VIOLATES_CONSTRAINT;
538 }
539 #endif // INCLUDE_ALL_GCS
540 #endif // _LP64
541 return Flag::SUCCESS;
542 }
543
544 Flag::Error MinTLABSizeConstraintFunc(size_t value, bool verbose) {
545 // At least, alignment reserve area is needed.
546 if (value < ThreadLocalAllocBuffer::alignment_reserve_in_bytes()) {
547 CommandLineError::print(verbose,
548 "MinTLABSize (" SIZE_FORMAT ") must be greater than or equal to "
549 "reserved area in TLAB (" SIZE_FORMAT ")\n",
550 value, ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
551 return Flag::VIOLATES_CONSTRAINT;
552 } else {
553 return Flag::SUCCESS;
554 }
555 }
556
557 Flag::Error TLABSizeConstraintFunc(size_t value, bool verbose) {
558 // Skip for default value of zero which means set ergonomically.
559 if (FLAG_IS_CMDLINE(TLABSize)) {
560 if (value < MinTLABSize) {
561 CommandLineError::print(verbose,
562 "TLABSize (" SIZE_FORMAT ") must be greater than or equal to "
563 "MinTLABSize (" SIZE_FORMAT ")\n",
564 value, MinTLABSize);
565 return Flag::VIOLATES_CONSTRAINT;
566 }
567 if (value > ThreadLocalAllocBuffer::max_size() * HeapWordSize) {
568 CommandLineError::print(verbose,
569 "TLABSize (" SIZE_FORMAT ") must be less than or equal to "
570 "ergonomic TLAB maximum size (" SIZE_FORMAT ")\n",
571 value, ThreadLocalAllocBuffer::max_size() * HeapWordSize);
572 return Flag::VIOLATES_CONSTRAINT;
573 }
574 }
575 return Flag::SUCCESS;
576 }
577
578 Flag::Error SurvivorRatioConstraintFunc(uintx value, bool verbose) {
579 if (FLAG_IS_CMDLINE(SurvivorRatio) &&
580 (value > MaxHeapSize / Universe::heap()->collector_policy()->space_alignment())) {
581 CommandLineError::print(verbose,
582 "SurvivorRatio (" UINTX_FORMAT ") must be less than or equal to "
583 "ergonomic SurvivorRatio maximum (" SIZE_FORMAT ")\n",
584 value,
585 MaxHeapSize / Universe::heap()->collector_policy()->space_alignment());
586 return Flag::VIOLATES_CONSTRAINT;
587 } else {
588 return Flag::SUCCESS;
589 }
590 }
591
592 Flag::Error MetaspaceSizeConstraintFunc(size_t value, bool verbose) {
593 if (value > MaxMetaspaceSize) {
594 CommandLineError::print(verbose,
595 "MetaspaceSize (" SIZE_FORMAT ") must be less than or equal to "
596 "MaxMetaspaceSize (" SIZE_FORMAT ")\n",
597 value, MaxMetaspaceSize);
598 return Flag::VIOLATES_CONSTRAINT;
599 } else {
600 return Flag::SUCCESS;
601 }
602 }
603
604 Flag::Error MaxMetaspaceSizeConstraintFunc(size_t value, bool verbose) {
605 if (value < MetaspaceSize) {
606 CommandLineError::print(verbose,
607 "MaxMetaspaceSize (" SIZE_FORMAT ") must be greater than or equal to "
608 "MetaspaceSize (" SIZE_FORMAT ")\n",
609 value, MaxMetaspaceSize);
610 return Flag::VIOLATES_CONSTRAINT;
611 } else {
612 return Flag::SUCCESS;
613 }
614 }
615
616 Flag::Error SurvivorAlignmentInBytesConstraintFunc(intx value, bool verbose) {
617 if (value != 0) {
618 if (!is_power_of_2(value)) {
619 CommandLineError::print(verbose,
620 "SurvivorAlignmentInBytes (" INTX_FORMAT ") must be "
621 "power of 2\n",
622 value);
623 return Flag::VIOLATES_CONSTRAINT;
624 }
625 if (value < ObjectAlignmentInBytes) {
626 CommandLineError::print(verbose,
627 "SurvivorAlignmentInBytes (" INTX_FORMAT ") must be "
628 "greater than or equal to ObjectAlignmentInBytes (" INTX_FORMAT ")\n",
629 value, ObjectAlignmentInBytes);
|