comparison src/share/vm/runtime/arguments.cpp @ 2368:dde920245681

6896099: Integrate CMS heap ergo with default heap sizing ergo 6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m 7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification 7027529: CMS: retire CMSUseOldDefaults flag Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago. Reviewed-by: brutisso, poonam
author ysr
date Wed, 16 Mar 2011 10:37:08 -0700
parents 1fb790245268
children 048f98400b8e
comparison
equal deleted inserted replaced
2367:1abd292f8c38 2368:dde920245681
1099 // as needed. 1099 // as needed.
1100 if (UseParNewGC) { 1100 if (UseParNewGC) {
1101 set_parnew_gc_flags(); 1101 set_parnew_gc_flags();
1102 } 1102 }
1103 1103
1104 // MaxHeapSize is aligned down in collectorPolicy
1105 size_t max_heap = align_size_down(MaxHeapSize,
1106 CardTableRS::ct_max_alignment_constraint());
1107
1104 // Now make adjustments for CMS 1108 // Now make adjustments for CMS
1105 size_t young_gen_per_worker; 1109 intx tenuring_default = (intx)6;
1106 intx new_ratio; 1110 size_t young_gen_per_worker = CMSYoungGenPerWorker;
1107 size_t min_new_default; 1111
1108 intx tenuring_default; 1112 // Preferred young gen size for "short" pauses:
1109 if (CMSUseOldDefaults) { // old defaults: "old" as of 6.0 1113 // upper bound depends on # of threads and NewRatio.
1110 if FLAG_IS_DEFAULT(CMSYoungGenPerWorker) {
1111 FLAG_SET_ERGO(intx, CMSYoungGenPerWorker, 4*M);
1112 }
1113 young_gen_per_worker = 4*M;
1114 new_ratio = (intx)15;
1115 min_new_default = 4*M;
1116 tenuring_default = (intx)0;
1117 } else { // new defaults: "new" as of 6.0
1118 young_gen_per_worker = CMSYoungGenPerWorker;
1119 new_ratio = (intx)7;
1120 min_new_default = 16*M;
1121 tenuring_default = (intx)4;
1122 }
1123
1124 // Preferred young gen size for "short" pauses
1125 const uintx parallel_gc_threads = 1114 const uintx parallel_gc_threads =
1126 (ParallelGCThreads == 0 ? 1 : ParallelGCThreads); 1115 (ParallelGCThreads == 0 ? 1 : ParallelGCThreads);
1127 const size_t preferred_max_new_size_unaligned = 1116 const size_t preferred_max_new_size_unaligned =
1128 ScaleForWordSize(young_gen_per_worker * parallel_gc_threads); 1117 MIN2(max_heap/(NewRatio+1), ScaleForWordSize(young_gen_per_worker * parallel_gc_threads));
1129 const size_t preferred_max_new_size = 1118 size_t preferred_max_new_size =
1130 align_size_up(preferred_max_new_size_unaligned, os::vm_page_size()); 1119 align_size_up(preferred_max_new_size_unaligned, os::vm_page_size());
1131 1120
1132 // Unless explicitly requested otherwise, size young gen 1121 // Unless explicitly requested otherwise, size young gen
1133 // for "short" pauses ~ 4M*ParallelGCThreads 1122 // for "short" pauses ~ CMSYoungGenPerWorker*ParallelGCThreads
1134 1123
1135 // If either MaxNewSize or NewRatio is set on the command line, 1124 // If either MaxNewSize or NewRatio is set on the command line,
1136 // assume the user is trying to set the size of the young gen. 1125 // assume the user is trying to set the size of the young gen.
1137
1138 if (FLAG_IS_DEFAULT(MaxNewSize) && FLAG_IS_DEFAULT(NewRatio)) { 1126 if (FLAG_IS_DEFAULT(MaxNewSize) && FLAG_IS_DEFAULT(NewRatio)) {
1139 1127
1140 // Set MaxNewSize to our calculated preferred_max_new_size unless 1128 // Set MaxNewSize to our calculated preferred_max_new_size unless
1141 // NewSize was set on the command line and it is larger than 1129 // NewSize was set on the command line and it is larger than
1142 // preferred_max_new_size. 1130 // preferred_max_new_size.
1145 } else { 1133 } else {
1146 FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size); 1134 FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size);
1147 } 1135 }
1148 if (PrintGCDetails && Verbose) { 1136 if (PrintGCDetails && Verbose) {
1149 // Too early to use gclog_or_tty 1137 // Too early to use gclog_or_tty
1150 tty->print_cr("Ergo set MaxNewSize: " SIZE_FORMAT, MaxNewSize); 1138 tty->print_cr("CMS ergo set MaxNewSize: " SIZE_FORMAT, MaxNewSize);
1151 } 1139 }
1152
1153 // Unless explicitly requested otherwise, prefer a large
1154 // Old to Young gen size so as to shift the collection load
1155 // to the old generation concurrent collector
1156
1157 // If this is only guarded by FLAG_IS_DEFAULT(NewRatio)
1158 // then NewSize and OldSize may be calculated. That would
1159 // generally lead to some differences with ParNewGC for which
1160 // there was no obvious reason. Also limit to the case where
1161 // MaxNewSize has not been set.
1162
1163 FLAG_SET_ERGO(intx, NewRatio, MAX2(NewRatio, new_ratio));
1164 1140
1165 // Code along this path potentially sets NewSize and OldSize 1141 // Code along this path potentially sets NewSize and OldSize
1166 1142
1167 // Calculate the desired minimum size of the young gen but if 1143 assert(max_heap >= InitialHeapSize, "Error");
1168 // NewSize has been set on the command line, use it here since 1144 assert(max_heap >= NewSize, "Error");
1169 // it should be the final value.
1170 size_t min_new;
1171 if (FLAG_IS_DEFAULT(NewSize)) {
1172 min_new = align_size_up(ScaleForWordSize(min_new_default),
1173 os::vm_page_size());
1174 } else {
1175 min_new = NewSize;
1176 }
1177 size_t prev_initial_size = InitialHeapSize;
1178 if (prev_initial_size != 0 && prev_initial_size < min_new + OldSize) {
1179 FLAG_SET_ERGO(uintx, InitialHeapSize, min_new + OldSize);
1180 // Currently minimum size and the initial heap sizes are the same.
1181 set_min_heap_size(InitialHeapSize);
1182 if (PrintGCDetails && Verbose) {
1183 warning("Initial heap size increased to " SIZE_FORMAT " M from "
1184 SIZE_FORMAT " M; use -XX:NewSize=... for finer control.",
1185 InitialHeapSize/M, prev_initial_size/M);
1186 }
1187 }
1188
1189 // MaxHeapSize is aligned down in collectorPolicy
1190 size_t max_heap =
1191 align_size_down(MaxHeapSize,
1192 CardTableRS::ct_max_alignment_constraint());
1193 1145
1194 if (PrintGCDetails && Verbose) { 1146 if (PrintGCDetails && Verbose) {
1195 // Too early to use gclog_or_tty 1147 // Too early to use gclog_or_tty
1196 tty->print_cr("CMS set min_heap_size: " SIZE_FORMAT 1148 tty->print_cr("CMS set min_heap_size: " SIZE_FORMAT
1197 " initial_heap_size: " SIZE_FORMAT 1149 " initial_heap_size: " SIZE_FORMAT
1198 " max_heap: " SIZE_FORMAT, 1150 " max_heap: " SIZE_FORMAT,
1199 min_heap_size(), InitialHeapSize, max_heap); 1151 min_heap_size(), InitialHeapSize, max_heap);
1200 } 1152 }
1201 if (max_heap > min_new) { 1153 size_t min_new = preferred_max_new_size;
1154 if (FLAG_IS_CMDLINE(NewSize)) {
1155 min_new = NewSize;
1156 }
1157 if (max_heap > min_new && min_heap_size() > min_new) {
1202 // Unless explicitly requested otherwise, make young gen 1158 // Unless explicitly requested otherwise, make young gen
1203 // at least min_new, and at most preferred_max_new_size. 1159 // at least min_new, and at most preferred_max_new_size.
1204 if (FLAG_IS_DEFAULT(NewSize)) { 1160 if (FLAG_IS_DEFAULT(NewSize)) {
1205 FLAG_SET_ERGO(uintx, NewSize, MAX2(NewSize, min_new)); 1161 FLAG_SET_ERGO(uintx, NewSize, MAX2(NewSize, min_new));
1206 FLAG_SET_ERGO(uintx, NewSize, MIN2(preferred_max_new_size, NewSize)); 1162 FLAG_SET_ERGO(uintx, NewSize, MIN2(preferred_max_new_size, NewSize));
1207 if (PrintGCDetails && Verbose) { 1163 if (PrintGCDetails && Verbose) {
1208 // Too early to use gclog_or_tty 1164 // Too early to use gclog_or_tty
1209 tty->print_cr("Ergo set NewSize: " SIZE_FORMAT, NewSize); 1165 tty->print_cr("CMS ergo set NewSize: " SIZE_FORMAT, NewSize);
1210 } 1166 }
1211 } 1167 }
1212 // Unless explicitly requested otherwise, size old gen 1168 // Unless explicitly requested otherwise, size old gen
1213 // so that it's at least 3X of NewSize to begin with; 1169 // so it's NewRatio x of NewSize.
1214 // later NewRatio will decide how it grows; see above.
1215 if (FLAG_IS_DEFAULT(OldSize)) { 1170 if (FLAG_IS_DEFAULT(OldSize)) {
1216 if (max_heap > NewSize) { 1171 if (max_heap > NewSize) {
1217 FLAG_SET_ERGO(uintx, OldSize, MIN2(3*NewSize, max_heap - NewSize)); 1172 FLAG_SET_ERGO(uintx, OldSize, MIN2(NewRatio*NewSize, max_heap - NewSize));
1218 if (PrintGCDetails && Verbose) { 1173 if (PrintGCDetails && Verbose) {
1219 // Too early to use gclog_or_tty 1174 // Too early to use gclog_or_tty
1220 tty->print_cr("Ergo set OldSize: " SIZE_FORMAT, OldSize); 1175 tty->print_cr("CMS ergo set OldSize: " SIZE_FORMAT, OldSize);
1221 } 1176 }
1222 } 1177 }
1223 } 1178 }
1224 } 1179 }
1225 } 1180 }
3059 "Incompatible compilation policy selected", NULL); 3014 "Incompatible compilation policy selected", NULL);
3060 } 3015 }
3061 } 3016 }
3062 3017
3063 #ifndef KERNEL 3018 #ifndef KERNEL
3064 if (UseConcMarkSweepGC) { 3019 // Set heap size based on available physical memory
3065 // Set flags for CMS and ParNew. Check UseConcMarkSweep first 3020 set_heap_size();
3066 // to ensure that when both UseConcMarkSweepGC and UseParNewGC 3021 // Set per-collector flags
3067 // are true, we don't call set_parnew_gc_flags() as well. 3022 if (UseParallelGC || UseParallelOldGC) {
3023 set_parallel_gc_flags();
3024 } else if (UseConcMarkSweepGC) { // should be done before ParNew check below
3068 set_cms_and_parnew_gc_flags(); 3025 set_cms_and_parnew_gc_flags();
3069 } else { 3026 } else if (UseParNewGC) { // skipped if CMS is set above
3070 // Set heap size based on available physical memory 3027 set_parnew_gc_flags();
3071 set_heap_size(); 3028 } else if (UseG1GC) {
3072 // Set per-collector flags 3029 set_g1_gc_flags();
3073 if (UseParallelGC || UseParallelOldGC) {
3074 set_parallel_gc_flags();
3075 } else if (UseParNewGC) {
3076 set_parnew_gc_flags();
3077 } else if (UseG1GC) {
3078 set_g1_gc_flags();
3079 }
3080 } 3030 }
3081 #endif // KERNEL 3031 #endif // KERNEL
3082 3032
3083 #ifdef SERIALGC 3033 #ifdef SERIALGC
3084 assert(verify_serial_gc_flags(), "SerialGC unset"); 3034 assert(verify_serial_gc_flags(), "SerialGC unset");