Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/arguments.cpp @ 1145:e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa
author | ysr |
---|---|
date | Wed, 23 Dec 2009 09:23:54 -0800 |
parents | 84cb6f20afb3 |
children | 75bd253e25dd |
comparison
equal
deleted
inserted
replaced
1111:44f61c24ddab | 1145:e018e6884bd8 |
---|---|
946 } else { | 946 } else { |
947 FLAG_SET_DEFAULT(UseSharedSpaces, false); | 947 FLAG_SET_DEFAULT(UseSharedSpaces, false); |
948 } | 948 } |
949 } | 949 } |
950 | 950 |
951 #ifndef KERNEL | |
951 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC | 952 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC |
952 // if it's not explictly set or unset. If the user has chosen | 953 // if it's not explictly set or unset. If the user has chosen |
953 // UseParNewGC and not explicitly set ParallelGCThreads we | 954 // UseParNewGC and not explicitly set ParallelGCThreads we |
954 // set it, unless this is a single cpu machine. | 955 // set it, unless this is a single cpu machine. |
955 void Arguments::set_parnew_gc_flags() { | 956 void Arguments::set_parnew_gc_flags() { |
1175 // OldPLABSize is not the default value but CMSParPromoteBlocksToClaim | 1176 // OldPLABSize is not the default value but CMSParPromoteBlocksToClaim |
1176 // is. In this situtation let CMSParPromoteBlocksToClaim follow | 1177 // is. In this situtation let CMSParPromoteBlocksToClaim follow |
1177 // the value (either from the command line or ergonomics) of | 1178 // the value (either from the command line or ergonomics) of |
1178 // OldPLABSize. Following OldPLABSize is an ergonomics decision. | 1179 // OldPLABSize. Following OldPLABSize is an ergonomics decision. |
1179 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize); | 1180 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize); |
1180 } | 1181 } else { |
1181 else { | |
1182 // OldPLABSize and CMSParPromoteBlocksToClaim are both set. | 1182 // OldPLABSize and CMSParPromoteBlocksToClaim are both set. |
1183 // CMSParPromoteBlocksToClaim is a collector-specific flag, so | 1183 // CMSParPromoteBlocksToClaim is a collector-specific flag, so |
1184 // we'll let it to take precedence. | 1184 // we'll let it to take precedence. |
1185 jio_fprintf(defaultStream::error_stream(), | 1185 jio_fprintf(defaultStream::error_stream(), |
1186 "Both OldPLABSize and CMSParPromoteBlocksToClaim" | 1186 "Both OldPLABSize and CMSParPromoteBlocksToClaim" |
1187 " options are specified for the CMS collector." | 1187 " options are specified for the CMS collector." |
1188 " CMSParPromoteBlocksToClaim will take precedence.\n"); | 1188 " CMSParPromoteBlocksToClaim will take precedence.\n"); |
1189 } | 1189 } |
1190 } | 1190 } |
1191 } | 1191 if (!FLAG_IS_DEFAULT(ResizeOldPLAB) && !ResizeOldPLAB) { |
1192 // OldPLAB sizing manually turned off: Use a larger default setting, | |
1193 // unless it was manually specified. This is because a too-low value | |
1194 // will slow down scavenges. | |
1195 if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) { | |
1196 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, 50); // default value before 6631166 | |
1197 } | |
1198 } | |
1199 // Overwrite OldPLABSize which is the variable we will internally use everywhere. | |
1200 FLAG_SET_ERGO(uintx, OldPLABSize, CMSParPromoteBlocksToClaim); | |
1201 // If either of the static initialization defaults have changed, note this | |
1202 // modification. | |
1203 if (!FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim) || !FLAG_IS_DEFAULT(OldPLABWeight)) { | |
1204 CFLS_LAB::modify_initialization(OldPLABSize, OldPLABWeight); | |
1205 } | |
1206 } | |
1207 #endif // KERNEL | |
1192 | 1208 |
1193 inline uintx max_heap_for_compressed_oops() { | 1209 inline uintx max_heap_for_compressed_oops() { |
1194 LP64_ONLY(return oopDesc::OopEncodingHeapMax - MaxPermSize - os::vm_page_size()); | 1210 LP64_ONLY(return oopDesc::OopEncodingHeapMax - MaxPermSize - os::vm_page_size()); |
1195 NOT_LP64(ShouldNotReachHere(); return 0); | 1211 NOT_LP64(ShouldNotReachHere(); return 0); |
1196 } | 1212 } |
2368 #else // ndef SOLARIS | 2384 #else // ndef SOLARIS |
2369 jio_fprintf(defaultStream::error_stream(), | 2385 jio_fprintf(defaultStream::error_stream(), |
2370 "ExtendedDTraceProbes flag is only applicable on Solaris\n"); | 2386 "ExtendedDTraceProbes flag is only applicable on Solaris\n"); |
2371 return JNI_EINVAL; | 2387 return JNI_EINVAL; |
2372 #endif // ndef SOLARIS | 2388 #endif // ndef SOLARIS |
2373 } else | |
2374 #ifdef ASSERT | 2389 #ifdef ASSERT |
2375 if (match_option(option, "-XX:+FullGCALot", &tail)) { | 2390 } else if (match_option(option, "-XX:+FullGCALot", &tail)) { |
2376 FLAG_SET_CMDLINE(bool, FullGCALot, true); | 2391 FLAG_SET_CMDLINE(bool, FullGCALot, true); |
2377 // disable scavenge before parallel mark-compact | 2392 // disable scavenge before parallel mark-compact |
2378 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); | 2393 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); |
2379 } else | |
2380 #endif | 2394 #endif |
2381 if (match_option(option, "-XX:ParCMSPromoteBlocksToClaim=", &tail)) { | 2395 } else if (match_option(option, "-XX:CMSParPromoteBlocksToClaim=", &tail)) { |
2382 julong cms_blocks_to_claim = (julong)atol(tail); | 2396 julong cms_blocks_to_claim = (julong)atol(tail); |
2383 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim); | 2397 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim); |
2384 jio_fprintf(defaultStream::error_stream(), | 2398 jio_fprintf(defaultStream::error_stream(), |
2385 "Please use -XX:CMSParPromoteBlocksToClaim in place of " | 2399 "Please use -XX:OldPLABSize in place of " |
2400 "-XX:CMSParPromoteBlocksToClaim in the future\n"); | |
2401 } else if (match_option(option, "-XX:ParCMSPromoteBlocksToClaim=", &tail)) { | |
2402 julong cms_blocks_to_claim = (julong)atol(tail); | |
2403 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim); | |
2404 jio_fprintf(defaultStream::error_stream(), | |
2405 "Please use -XX:OldPLABSize in place of " | |
2386 "-XX:ParCMSPromoteBlocksToClaim in the future\n"); | 2406 "-XX:ParCMSPromoteBlocksToClaim in the future\n"); |
2387 } else | 2407 } else if (match_option(option, "-XX:ParallelGCOldGenAllocBufferSize=", &tail)) { |
2388 if (match_option(option, "-XX:ParallelGCOldGenAllocBufferSize=", &tail)) { | |
2389 julong old_plab_size = 0; | 2408 julong old_plab_size = 0; |
2390 ArgsRange errcode = parse_memory_size(tail, &old_plab_size, 1); | 2409 ArgsRange errcode = parse_memory_size(tail, &old_plab_size, 1); |
2391 if (errcode != arg_in_range) { | 2410 if (errcode != arg_in_range) { |
2392 jio_fprintf(defaultStream::error_stream(), | 2411 jio_fprintf(defaultStream::error_stream(), |
2393 "Invalid old PLAB size: %s\n", option->optionString); | 2412 "Invalid old PLAB size: %s\n", option->optionString); |
2396 } | 2415 } |
2397 FLAG_SET_CMDLINE(uintx, OldPLABSize, old_plab_size); | 2416 FLAG_SET_CMDLINE(uintx, OldPLABSize, old_plab_size); |
2398 jio_fprintf(defaultStream::error_stream(), | 2417 jio_fprintf(defaultStream::error_stream(), |
2399 "Please use -XX:OldPLABSize in place of " | 2418 "Please use -XX:OldPLABSize in place of " |
2400 "-XX:ParallelGCOldGenAllocBufferSize in the future\n"); | 2419 "-XX:ParallelGCOldGenAllocBufferSize in the future\n"); |
2401 } else | 2420 } else if (match_option(option, "-XX:ParallelGCToSpaceAllocBufferSize=", &tail)) { |
2402 if (match_option(option, "-XX:ParallelGCToSpaceAllocBufferSize=", &tail)) { | |
2403 julong young_plab_size = 0; | 2421 julong young_plab_size = 0; |
2404 ArgsRange errcode = parse_memory_size(tail, &young_plab_size, 1); | 2422 ArgsRange errcode = parse_memory_size(tail, &young_plab_size, 1); |
2405 if (errcode != arg_in_range) { | 2423 if (errcode != arg_in_range) { |
2406 jio_fprintf(defaultStream::error_stream(), | 2424 jio_fprintf(defaultStream::error_stream(), |
2407 "Invalid young PLAB size: %s\n", option->optionString); | 2425 "Invalid young PLAB size: %s\n", option->optionString); |
2410 } | 2428 } |
2411 FLAG_SET_CMDLINE(uintx, YoungPLABSize, young_plab_size); | 2429 FLAG_SET_CMDLINE(uintx, YoungPLABSize, young_plab_size); |
2412 jio_fprintf(defaultStream::error_stream(), | 2430 jio_fprintf(defaultStream::error_stream(), |
2413 "Please use -XX:YoungPLABSize in place of " | 2431 "Please use -XX:YoungPLABSize in place of " |
2414 "-XX:ParallelGCToSpaceAllocBufferSize in the future\n"); | 2432 "-XX:ParallelGCToSpaceAllocBufferSize in the future\n"); |
2415 } else | 2433 } else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx |
2416 if (match_option(option, "-XX:", &tail)) { // -XX:xxxx | |
2417 // Skip -XX:Flags= since that case has already been handled | 2434 // Skip -XX:Flags= since that case has already been handled |
2418 if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) { | 2435 if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) { |
2419 if (!process_argument(tail, args->ignoreUnrecognized, origin)) { | 2436 if (!process_argument(tail, args->ignoreUnrecognized, origin)) { |
2420 return JNI_EINVAL; | 2437 return JNI_EINVAL; |
2421 } | 2438 } |
2725 // Check the GC selections again. | 2742 // Check the GC selections again. |
2726 if (!check_gc_consistency()) { | 2743 if (!check_gc_consistency()) { |
2727 return JNI_EINVAL; | 2744 return JNI_EINVAL; |
2728 } | 2745 } |
2729 | 2746 |
2747 #ifndef KERNEL | |
2730 if (UseConcMarkSweepGC) { | 2748 if (UseConcMarkSweepGC) { |
2731 // Set flags for CMS and ParNew. Check UseConcMarkSweep first | 2749 // Set flags for CMS and ParNew. Check UseConcMarkSweep first |
2732 // to ensure that when both UseConcMarkSweepGC and UseParNewGC | 2750 // to ensure that when both UseConcMarkSweepGC and UseParNewGC |
2733 // are true, we don't call set_parnew_gc_flags() as well. | 2751 // are true, we don't call set_parnew_gc_flags() as well. |
2734 set_cms_and_parnew_gc_flags(); | 2752 set_cms_and_parnew_gc_flags(); |
2742 set_parnew_gc_flags(); | 2760 set_parnew_gc_flags(); |
2743 } else if (UseG1GC) { | 2761 } else if (UseG1GC) { |
2744 set_g1_gc_flags(); | 2762 set_g1_gc_flags(); |
2745 } | 2763 } |
2746 } | 2764 } |
2765 #endif // KERNEL | |
2747 | 2766 |
2748 #ifdef SERIALGC | 2767 #ifdef SERIALGC |
2749 assert(verify_serial_gc_flags(), "SerialGC unset"); | 2768 assert(verify_serial_gc_flags(), "SerialGC unset"); |
2750 #endif // SERIALGC | 2769 #endif // SERIALGC |
2751 | 2770 |