Explaining Advanced JVM Options
1. Introduction
The Java Virtual Machine (JVM) is highly customizable via its options. It includes basic configuration through standard options, general performance tuning through non-standard options, and precise control through advanced options. JVM advanced options allow developers to fine-tune performance, diagnose issues, and experiment with cutting-edge features.
2. Classification of JVM Options
Java Virtual Machine(JVM) options are parameters that control the behavior and performance of the JVM during the execution of a Java application.
- Standard Options. Here are common examples:
-version
to display the JVM version.-help
to display the help information about JVM options.-cp {path} or -classpath {path}
to specify the location of user classes or libraries.-jar {jarFile}
to run a jar file for the given{jarFile}
.-Dproperty=value
to set a system property with the value.
- Non-standard Options: options begin with
-X
are not guaranteed to be supported on all VM implementations, and are subject to change without notice in subsequent releases of the JDK. Here are common non-standard options:-Xms#
sets the initial heap size when the JVM starts.-Xmx#
sets the maximum heap size for the JVM. Setting both initial and maximum heap size to the same value can avoid the overhead on heap resizing but can waste memory if not used.-Xmn#
sets the size of the young generation (part of the heap).-Xss#
sets the stack size for each thread.-Xdebug
enables debugging support in the JVM.
- Advanced Options: options begin with
-XX
are not stable and are subject to change without notice. Here are two common advanced options. Step 3 includes more advanced options.-XX:+HeapDumpOnOutOfMemoryError
generates a heap dump when anOutOfMemoryError
occurs.-XX:HeapDumpPath={path_to_dump_file}
specifies the path location.
3. Advanced JVM Options
Advanced JVM options start with -XX. The -XX:+{option}
enables the given option and -XX:-{option}
disables that option. It can be categorized based on their functionality:
- JVM Heap and Memory Management Options: allocate memory for the Java heap and control the garbage collection behavior. Step 4 includes more details.
- JIT compilation Options: Step 5 includes more details.
- Garbage Collection (GC) Options: define and tune the garbage collection behavior and how the JVM reclaims memory.
-XX:+UseG1GC
: Use the G1 garbage collector.-XX:+UseConcMarkSweepGC
: Use the Concurrent Mark-Sweep (CMS) garbage collector.-XX:+UseParallelGC
: Use the parallel garbage collector.
- JVM Performance Tuning Options: include options for JIT (Just-In-Time) compilation, threading, and other performance-related parameters.
-XX:+UseParallelGC
: Use the parallel garbage collector.-XX:+AggressiveOpts
: Enable aggressive optimization settings for performance.-XX:MaxInlineLevel
: Control the maximum number of methods that can be inlined.
- JVM Debugging and Profiling Options: enable debugging and profiling features.
-Xdebug
: Enable debugging.-Xrunjdwp
: Start the JVM with a debugging agent.-XX:+HeapDumpOnOutOfMemoryError
: Generate a heap dump when anOutOfMemoryError
occurs.
- Diagnostic and Monitoring Options: provide information on the JVM’s internal state and can be used to monitor the JVM at runtime.
-XX:+PrintGCDetails
: Print detailed information about garbage collection.-XX:+PrintFlagsFinal
: Print JVM flags and their final values.-XX:+PrintCompilation
: Print information about JIT compilation.
4. Memory Management
JVM memory consists of Heap
, Metaspace
, Overhead
, and Native
memories. The Heap
memory is used for object storage and garbage collection. The garbage collector automatically manages memory by reclaiming space from unused objects. The heap is the largest chunk of memory and might allocate between 50% and 80% of the total available system memory for the JVM. The Metaspace
memory is used to store metadata about classes. The Overhead
memory is used for thread management, etc. The Native
memory is used to interact with the operating system. Depending on the application, advanced JVM options can be used to efficiently manage memory to avoid memory leaks and reduce unnecessary resource consumption. Here are the common memory management JVM options:
-XX:MetaspaceSize
: the initial size of the metaspace.-XX:MaxMetaspaceSize
: the maximum size of the metaspace.-XX:+AlwaysPreTouch
: reduces latency by pre-touching the Java heap during JVM initialization. Every heap page is, therefore, initialized on JVM startup rather than incrementally during application execution.-XX:MinHeapFreeRatio
and-XX:MaxHeapFreeRatio
: define the minimum and maximum percentage of how much free space is maintained in the heap after a GC cycle.-XX:InitialRAMPercentage
and-XX:MaxRAMPercentage
: define the initial and maximum heap size as percentages of the system’s available memory. These settings allow the JVM to scale its memory usage dynamically, offering better adaptability.-XX:MaxDirectMemorySize
: defines the amount of memory that can be reserved for Direct Byte Buffers.-XX:CompressedClassSpaceSize
: defines the maximum memory allocated for storing class metadata in the metaspace when using compressed class pointers (XX:UseCompressedClassPointers
).
5. Just-in-Time Compilation
The Just-In-Time (JIT) compiler in the JVM is a key component that improves the performance of Java applications by converting bytecode into native machine code at runtime. Unlike an interpreter, which executes bytecode line by line, the JIT compiler analyzes the bytecode during execution and compiles frequently used code paths into optimized machine code. This process helps reduce execution time, as the compiled code can be directly executed by the CPU without the overhead of interpretation. The JIT compiler performs optimizations like inlining, loop unrolling, and dead code elimination, making Java applications faster as they run longer. Here are common JIT options:
-XX:CICompilerCount
: defines the number of compiler threads used for JIT compilation. The default value is proportional to the number of available CPUs and memory.-XX:ReservedCodeCacheSize
: defines the maximum size of the memory area allocated for storing JIT-compiled native code.-XX:CompileThreshold
: defines the number of method invocations before the method is first compiled.-XX:MaxInlineSize
: defines the maximum allowable size (in bytes) for methods that the JIT compiler can inline.
6. JVM Options Example
In this step, I will modify the build.gradle
file in this project with customized JVM options in the test
task. I will highlight the advanced JVM options outlined in both step 4 and step 5.
modified build.gradle
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' } group = 'org.zheng.demo' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() maxHeapSize = "32m" jvmArgs = [ '-XX:+PrintFlagsFinal', '-XX:+HeapDumpOnOutOfMemoryError', '-XX:HeapDumpPath=heapdump.hprof' ] } |
- Line 38: sets the max heap size to 32 megabytes.
- Line 39:
-XX:+PrintFlagsFinal
advanced option enables the print function for all JVM flags (including all system properties or options) final values. The output includes the flag name, the final value of that flag, and the source of the value. - Line 40:
-XX:+HeapDumpOnOutOfMemoryError
enables heap dump when encounters theOutOfMemoryError
. - Line 41:
-XX:HeapDumpPath=heapdump.hprof
defines the heap dump file.
Execute the “gradlew clean build
” command and capture the output to the output1.txt
file.
C:\MaryTools\workspace\demomapsid>gradlew clean build > output1.txt
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 | > Task :clean > Task :compileJava > Task :processResources > Task :classes > Task :resolveMainClassName > Task :bootJar > Task :jar > Task :assemble > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test [Global flags] int ActiveProcessorCount = -1 {product} {default} uintx AdaptiveSizeDecrementScaleFactor = 4 {product} {default} uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product} {default} uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product} {default} uintx AdaptiveSizePolicyInitializingSteps = 20 {product} {default} uintx AdaptiveSizePolicyOutputInterval = 0 {product} {default} uintx AdaptiveSizePolicyWeight = 10 {product} {default} uintx AdaptiveSizeThroughPutPolicy = 0 {product} {default} uintx AdaptiveTimeWeight = 25 {product} {default} bool AggressiveHeap = false {product} {default} intx AliasLevel = 3 {C2 product} {default} bool AlignVector = false {C2 product} {default} ccstr AllocateHeapAt = {product} {default} intx AllocateInstancePrefetchLines = 1 {product} {default} intx AllocatePrefetchDistance = 192 {product} {default} intx AllocatePrefetchInstr = 3 {product} {default} intx AllocatePrefetchLines = 4 {product} {default} intx AllocatePrefetchStepSize = 64 {product} {default} intx AllocatePrefetchStyle = 1 {product} {default} bool AllowParallelDefineClass = false {product} {default} bool AllowRedefinitionToAddDeleteMethods = false {product} {default} bool AllowUserSignalHandlers = false {product} {default} bool AllowVectorizeOnDemand = true {C2 product} {default} bool AlwaysActAsServerClassMachine = false {product} {default} bool AlwaysCompileLoopMethods = false {product} {default} bool AlwaysLockClassLoader = false {product} {default} bool AlwaysPreTouch = false {product} {default} bool AlwaysRestoreFPU = false {product} {default} bool AlwaysTenure = false {product} {default} ccstr ArchiveClassesAtExit = {product} {default} intx ArrayCopyLoadStoreMaxElem = 8 {C2 product} {default} size_t AsyncLogBufferSize = 2097152 {product} {default} intx AutoBoxCacheMax = 128 {C2 product} {default} intx BCEATraceLevel = 0 {product} {default} bool BackgroundCompilation = true {pd product} {default} size_t BaseFootPrintEstimate = 268435456 {product} {default} intx BiasedLockingBulkRebiasThreshold = 20 {product} {default} intx BiasedLockingBulkRevokeThreshold = 40 {product} {default} intx BiasedLockingDecayTime = 25000 {product} {default} intx BiasedLockingStartupDelay = 0 {product} {default} bool BlockLayoutByFrequency = true {C2 product} {default} intx BlockLayoutMinDiamondPercentage = 20 {C2 product} {default} bool BlockLayoutRotateLoops = true {C2 product} {default} intx C1InlineStackLimit = 5 {C1 product} {default} intx C1MaxInlineLevel = 9 {C1 product} {default} intx C1MaxInlineSize = 35 {C1 product} {default} intx C1MaxRecursiveInlineLevel = 1 {C1 product} {default} intx C1MaxTrivialSize = 6 {C1 product} {default} bool C1OptimizeVirtualCallProfiling = true {C1 product} {default} bool C1ProfileBranches = true {C1 product} {default} bool C1ProfileCalls = true {C1 product} {default} bool C1ProfileCheckcasts = true {C1 product} {default} bool C1ProfileInlinedCalls = true {C1 product} {default} bool C1ProfileVirtualCalls = true {C1 product} {default} bool C1UpdateMethodData = true {C1 product} {default} intx CICompilerCount = 4 {product} {ergonomic} bool CICompilerCountPerCPU = true {product} {default} bool CITime = false {product} {default} bool CheckJNICalls = false {product} {default} bool ClassUnloading = true {product} {default} bool ClassUnloadingWithConcurrentMark = true {product} {default} bool ClipInlining = true {product} {default} uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} ccstr CompilationMode = default {product} {default} ccstrlist CompileCommand = {product} {default} ccstr CompileCommandFile = {product} {default} ccstrlist CompileOnly = {product} {default} intx CompileThreshold = 10000 {pd product} {default} double CompileThresholdScaling = 1.000000 {product} {default} intx CompilerThreadPriority = -1 {product} {default} intx CompilerThreadStackSize = 0 {pd product} {default} size_t CompressedClassSpaceSize = 1073741824 {product} {default} uint ConcGCThreads = 2 {product} {ergonomic} intx ConditionalMoveLimit = 3 {C2 pd product} {default} intx ContendedPaddingWidth = 128 {product} {default} bool CrashOnOutOfMemoryError = false {product} {default} bool CreateCoredumpOnCrash = true {product} {default} bool CriticalJNINatives = false {product} {default} bool DTraceAllocProbes = false {product} {default} bool DTraceMethodProbes = false {product} {default} bool DTraceMonitorProbes = false {product} {default} bool DisableAttachMechanism = false {product} {default} bool DisableExplicitGC = false {product} {default} bool DisplayVMOutputToStderr = false {product} {default} bool DisplayVMOutputToStdout = false {product} {default} bool DoEscapeAnalysis = true {C2 product} {default} bool DoReserveCopyInSuperWord = true {C2 product} {default} bool DontCompileHugeMethods = true {product} {default} bool DontYieldALot = false {pd product} {default} ccstr DumpLoadedClassList = {product} {default} bool DumpReplayDataOnError = true {product} {default} bool DumpSharedSpaces = false {product} {default} bool DynamicDumpSharedSpaces = false {product} {default} bool EagerXrunInit = false {product} {default} intx EliminateAllocationArraySizeLimit = 64 {C2 product} {default} bool EliminateAllocations = true {C2 product} {default} bool EliminateAutoBox = true {C2 product} {default} bool EliminateLocks = true {C2 product} {default} bool EliminateNestedLocks = true {C2 product} {default} bool EnableContended = true {product} {default} bool EnableDynamicAgentLoading = true {product} {default} size_t ErgoHeapSizeLimit = 0 {product} {default} ccstr ErrorFile = {product} {default} bool ErrorFileToStderr = false {product} {default} bool ErrorFileToStdout = false {product} {default} uint64_t ErrorLogTimeout = 120 {product} {default} double EscapeAnalysisTimeout = 20.000000 {C2 product} {default} bool EstimateArgEscape = true {product} {default} bool ExecutingUnitTests = false {product} {default} bool ExitOnOutOfMemoryError = false {product} {default} bool ExplicitGCInvokesConcurrent = false {product} {default} bool ExtendedDTraceProbes = false {product} {default} bool ExtensiveErrorReports = false {product} {default} ccstr ExtraSharedClassListFile = {product} {default} bool FilterSpuriousWakeups = true {product} {default} bool FlightRecorder = false {product} {default} ccstr FlightRecorderOptions = {product} {default} bool ForceTimeHighResolution = false {product} {default} intx FreqInlineSize = 325 {C2 pd product} {default} double G1ConcMarkStepDurationMillis = 10.000000 {product} {default} uintx G1ConcRSHotCardLimit = 4 {product} {default} size_t G1ConcRSLogCacheSize = 10 {product} {default} size_t G1ConcRefinementGreenZone = 0 {product} {default} size_t G1ConcRefinementRedZone = 0 {product} {default} uintx G1ConcRefinementServiceIntervalMillis = 300 {product} {default} uint G1ConcRefinementThreads = 8 {product} {ergonomic} size_t G1ConcRefinementThresholdStep = 2 {product} {default} size_t G1ConcRefinementYellowZone = 0 {product} {default} uintx G1ConfidencePercent = 50 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx G1HeapWastePercent = 5 {product} {default} uintx G1MixedGCCountTarget = 8 {product} {default} uintx G1PeriodicGCInterval = 0 {manageable} {default} bool G1PeriodicGCInvokesConcurrent = true {product} {default} double G1PeriodicGCSystemLoadThreshold = 0.000000 {manageable} {default} intx G1RSetRegionEntries = 256 {product} {default} intx G1RSetSparseRegionEntries = 8 {product} {default} intx G1RSetUpdatingPauseTimePercent = 10 {product} {default} uint G1RefProcDrainInterval = 1000 {product} {default} uintx G1ReservePercent = 10 {product} {default} uintx G1SATBBufferEnqueueingThresholdPercent = 60 {product} {default} size_t G1SATBBufferSize = 1024 {product} {default} size_t G1UpdateBufferSize = 256 {product} {default} bool G1UseAdaptiveConcRefinement = true {product} {default} bool G1UseAdaptiveIHOP = true {product} {default} uintx GCDrainStackTargetSize = 64 {product} {ergonomic} uintx GCHeapFreeLimit = 2 {product} {default} uintx GCLockerEdenExpansionPercent = 5 {product} {default} uintx GCPauseIntervalMillis = 201 {product} {default} uintx GCTimeLimit = 98 {product} {default} uintx GCTimeRatio = 12 {product} {default} size_t HeapBaseMinAddress = 2147483648 {pd product} {default} bool HeapDumpAfterFullGC = false {manageable} {default} bool HeapDumpBeforeFullGC = false {manageable} {default} intx HeapDumpGzipLevel = 0 {manageable} {default} bool HeapDumpOnOutOfMemoryError = true {manageable} {command line} ccstr HeapDumpPath = heapdump.hprof {manageable} {command line} uintx HeapFirstMaximumCompactionCount = 3 {product} {default} uintx HeapMaximumCompactionInterval = 20 {product} {default} uintx HeapSearchSteps = 3 {product} {default} size_t HeapSizePerGCThread = 43620760 {product} {default} bool IgnoreEmptyClassPaths = false {product} {default} bool IgnoreUnrecognizedVMOptions = false {product} {default} uintx IncreaseFirstTierCompileThresholdAt = 50 {product} {default} bool IncrementalInline = true {C2 product} {default} uintx InitialCodeCacheSize = 2555904 {pd product} {default} size_t InitialHeapSize = 33554432 {product} {ergonomic} uintx InitialRAMFraction = 64 {product} {default} double InitialRAMPercentage = 1.562500 {product} {default} uintx InitialSurvivorRatio = 8 {product} {default} uintx InitialTenuringThreshold = 7 {product} {default} uintx InitiatingHeapOccupancyPercent = 45 {product} {default} bool Inline = true {product} {default} ccstr InlineDataFile = {product} {default} intx InlineSmallCode = 2500 {C2 pd product} {default} bool InlineSynchronizedMethods = true {C1 product} {default} intx InteriorEntryAlignment = 16 {C2 pd product} {default} intx InterpreterProfilePercentage = 33 {product} {default} bool JavaMonitorsInStackTrace = true {product} {default} intx JavaPriority10_To_OSPriority = -1 {product} {default} intx JavaPriority1_To_OSPriority = -1 {product} {default} intx JavaPriority2_To_OSPriority = -1 {product} {default} intx JavaPriority3_To_OSPriority = -1 {product} {default} intx JavaPriority4_To_OSPriority = -1 {product} {default} intx JavaPriority5_To_OSPriority = -1 {product} {default} intx JavaPriority6_To_OSPriority = -1 {product} {default} intx JavaPriority7_To_OSPriority = -1 {product} {default} intx JavaPriority8_To_OSPriority = -1 {product} {default} intx JavaPriority9_To_OSPriority = -1 {product} {default} size_t LargePageHeapSizeThreshold = 134217728 {product} {default} size_t LargePageSizeInBytes = 0 {product} {default} intx LiveNodeCountInliningCutoff = 40000 {C2 product} {default} intx LoopMaxUnroll = 16 {C2 product} {default} intx LoopOptsCount = 43 {C2 product} {default} intx LoopPercentProfileLimit = 30 {C2 pd product} {default} uintx LoopStripMiningIter = 1000 {C2 product} {default} uintx LoopStripMiningIterShortLoop = 100 {C2 product} {default} intx LoopUnrollLimit = 60 {C2 pd product} {default} intx LoopUnrollMin = 4 {C2 product} {default} bool LoopUnswitching = true {C2 product} {default} bool ManagementServer = false {product} {default} size_t MarkStackSize = 4194304 {product} {ergonomic} size_t MarkStackSizeMax = 536870912 {product} {default} uint MarkSweepAlwaysCompactCount = 4 {product} {default} uintx MarkSweepDeadRatio = 5 {product} {default} intx MaxBCEAEstimateLevel = 5 {product} {default} intx MaxBCEAEstimateSize = 150 {product} {default} uint64_t MaxDirectMemorySize = 0 {product} {default} bool MaxFDLimit = true {product} {default} uintx MaxGCMinorPauseMillis = 18446744073709551615 {product} {default} uintx MaxGCPauseMillis = 200 {product} {default} uintx MaxHeapFreeRatio = 70 {manageable} {default} size_t MaxHeapSize = 33554432 {product} {command line} intx MaxInlineLevel = 15 {C2 product} {default} intx MaxInlineSize = 35 {C2 product} {default} intx MaxJNILocalCapacity = 65536 {product} {default} intx MaxJavaStackTraceDepth = 1024 {product} {default} intx MaxJumpTableSize = 65000 {C2 product} {default} intx MaxJumpTableSparseness = 5 {C2 product} {default} intx MaxLabelRootDepth = 1100 {C2 product} {default} intx MaxLoopPad = 11 {C2 product} {default} size_t MaxMetaspaceExpansion = 5439488 {product} {default} uintx MaxMetaspaceFreeRatio = 70 {product} {default} size_t MaxMetaspaceSize = 18446744073709551615 {product} {default} size_t MaxNewSize = 19922944 {product} {ergonomic} intx MaxNodeLimit = 80000 {C2 product} {default} uint64_t MaxRAM = 137438953472 {pd product} {default} uintx MaxRAMFraction = 4 {product} {default} double MaxRAMPercentage = 25.000000 {product} {default} intx MaxRecursiveInlineLevel = 1 {C2 product} {default} uintx MaxTenuringThreshold = 15 {product} {default} intx MaxTrivialSize = 6 {C2 product} {default} intx MaxVectorSize = 64 {C2 product} {default} ccstr MetaspaceReclaimPolicy = balanced {product} {default} size_t MetaspaceSize = 22020096 {product} {default} bool MethodFlushing = true {product} {default} size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} uintx MinHeapFreeRatio = 40 {manageable} {default} size_t MinHeapSize = 8388608 {product} {ergonomic} intx MinInliningThreshold = 250 {product} {default} intx MinJumpTableSize = 10 {C2 pd product} {default} size_t MinMetaspaceExpansion = 327680 {product} {default} uintx MinMetaspaceFreeRatio = 40 {product} {default} uintx MinRAMFraction = 2 {product} {default} double MinRAMPercentage = 50.000000 {product} {default} uintx MinSurvivorRatio = 3 {product} {default} size_t MinTLABSize = 2048 {product} {default} intx MultiArrayExpandLimit = 6 {C2 product} {default} uintx NUMAChunkResizeWeight = 20 {product} {default} size_t NUMAInterleaveGranularity = 2097152 {product} {default} uintx NUMAPageScanRate = 256 {product} {default} size_t NUMASpaceResizeRate = 1073741824 {product} {default} bool NUMAStats = false {product} {default} ccstr NativeMemoryTracking = off {product} {default} bool NeverActAsServerClassMachine = false {pd product} {default} bool NeverTenure = false {product} {default} uintx NewRatio = 2 {product} {default} size_t NewSize = 1363144 {product} {default} size_t NewSizeThreadIncrease = 5320 {pd product} {default} intx NmethodSweepActivity = 10 {product} {default} intx NodeLimitFudgeFactor = 2000 {C2 product} {default} uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic} uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} intx NumberOfLoopInstrToAlign = 4 {C2 product} {default} intx ObjectAlignmentInBytes = 8 {product lp64_product} {default} size_t OldPLABSize = 1024 {product} {default} size_t OldSize = 5452592 {product} {default} bool OmitStackTraceInFastThrow = true {product} {default} ccstrlist OnError = {product} {default} ccstrlist OnOutOfMemoryError = {product} {default} intx OnStackReplacePercentage = 140 {pd product} {default} bool OptimizeFill = false {C2 product} {default} bool OptimizePtrCompare = true {C2 product} {default} bool OptimizeStringConcat = true {C2 product} {default} bool OptoBundling = false {C2 pd product} {default} intx OptoLoopAlignment = 16 {pd product} {default} bool OptoRegScheduling = true {C2 pd product} {default} bool OptoScheduling = false {C2 pd product} {default} uintx PLABWeight = 75 {product} {default} bool PSChunkLargeArrays = true {product} {default} int ParGCArrayScanChunk = 50 {product} {default} uintx ParallelGCBufferWastePct = 10 {product} {default} uint ParallelGCThreads = 8 {product} {default} size_t ParallelOldDeadWoodLimiterMean = 50 {product} {default} size_t ParallelOldDeadWoodLimiterStdDev = 80 {product} {default} bool ParallelRefProcBalancingEnabled = true {product} {default} bool ParallelRefProcEnabled = true {product} {default} bool PartialPeelAtUnsignedTests = true {C2 product} {default} bool PartialPeelLoop = true {C2 product} {default} intx PartialPeelNewPhiDelta = 0 {C2 product} {default} uintx PausePadding = 1 {product} {default} intx PerBytecodeRecompilationCutoff = 200 {product} {default} intx PerBytecodeTrapLimit = 4 {product} {default} intx PerMethodRecompilationCutoff = 400 {product} {default} intx PerMethodTrapLimit = 100 {product} {default} bool PerfAllowAtExitRegistration = false {product} {default} bool PerfBypassFileSystemCheck = false {product} {default} intx PerfDataMemorySize = 32768 {product} {default} intx PerfDataSamplingInterval = 50 {product} {default} ccstr PerfDataSaveFile = {product} {default} bool PerfDataSaveToFile = false {product} {default} bool PerfDisableSharedMem = false {product} {default} intx PerfMaxStringConstLength = 1024 {product} {default} size_t PreTouchParallelChunkSize = 1073741824 {pd product} {default} bool PreferInterpreterNativeStubs = false {pd product} {default} intx PrefetchCopyIntervalInBytes = 576 {product} {default} intx PrefetchFieldsAhead = 1 {product} {default} intx PrefetchScanIntervalInBytes = 576 {product} {default} bool PreserveAllAnnotations = false {product} {default} bool PreserveFramePointer = false {pd product} {default} size_t PretenureSizeThreshold = 0 {product} {default} bool PrintClassHistogram = false {manageable} {default} bool PrintCodeCache = false {product} {default} bool PrintCodeCacheOnCompilation = false {product} {default} bool PrintCommandLineFlags = false {product} {default} bool PrintCompilation = false {product} {default} bool PrintConcurrentLocks = false {manageable} {default} bool PrintExtendedThreadInfo = false {product} {default} bool PrintFlagsFinal = true {product} {command line} bool PrintFlagsInitial = false {product} {default} bool PrintFlagsRanges = false {product} {default} bool PrintGC = false {product} {default} bool PrintGCDetails = false {product} {default} bool PrintHeapAtSIGBREAK = true {product} {default} bool PrintSharedArchiveAndExit = false {product} {default} bool PrintSharedDictionary = false {product} {default} bool PrintStringTableStatistics = false {product} {default} bool PrintTieredEvents = false {product} {default} bool PrintVMOptions = false {product} {default} bool PrintWarnings = true {product} {default} uintx ProcessDistributionStride = 4 {product} {default} bool ProfileInterpreter = true {pd product} {default} intx ProfileMaturityPercentage = 20 {product} {default} uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic} uintx PromotedPadding = 3 {product} {default} uintx QueuedAllocationWarningCount = 0 {product} {default} int RTMRetryCount = 5 {ARCH product} {default} bool RangeCheckElimination = true {product} {default} bool ReassociateInvariants = true {C2 product} {default} bool RecordDynamicDumpInfo = false {product} {default} bool ReduceBulkZeroing = true {C2 product} {default} bool ReduceFieldZeroing = true {C2 product} {default} bool ReduceInitialCardMarks = true {C2 product} {default} bool ReduceSignalUsage = false {product} {default} intx RefDiscoveryPolicy = 0 {product} {default} bool RegisterFinalizersAtInit = true {product} {default} bool RelaxAccessControlCheck = false {product} {default} ccstr ReplayDataFile = {product} {default} bool RequireSharedSpaces = false {product} {default} uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} bool ResizePLAB = true {product} {default} bool ResizeTLAB = true {product} {default} bool RestoreMXCSROnJNICalls = false {product} {default} bool RestrictContended = true {product} {default} bool RestrictReservedStack = true {product} {default} bool RewriteBytecodes = true {pd product} {default} bool RewriteFrequentPairs = true {pd product} {default} bool SafepointTimeout = false {product} {default} intx SafepointTimeoutDelay = 10000 {product} {default} bool ScavengeBeforeFullGC = false {product} {default} bool SegmentedCodeCache = true {product} {ergonomic} intx SelfDestructTimer = 0 {product} {default} ccstr SharedArchiveConfigFile = {product} {default} ccstr SharedArchiveFile = {product} {default} size_t SharedBaseAddress = 34359738368 {product} {default} ccstr SharedClassListFile = {product} {default} uintx SharedSymbolTableBucketSize = 4 {product} {default} bool ShowCodeDetailsInExceptionMessages = true {manageable} {default} bool ShowMessageBoxOnError = false {product} {default} bool ShrinkHeapInSteps = true {product} {default} size_t SoftMaxHeapSize = 33554432 {manageable} {ergonomic} intx SoftRefLRUPolicyMSPerMB = 1000 {product} {default} bool SplitIfBlocks = true {C2 product} {default} intx StackRedPages = 1 {pd product} {default} intx StackReservedPages = 0 {pd product} {default} intx StackShadowPages = 7 {pd product} {default} bool StackTraceInThrowable = true {product} {default} intx StackYellowPages = 3 {pd product} {default} uintx StartAggressiveSweepingAt = 10 {product} {default} bool StartAttachListener = false {product} {default} ccstr StartFlightRecording = {product} {default} uint StringDeduplicationAgeThreshold = 3 {product} {default} uintx StringTableSize = 65536 {product} {default} bool SuperWordLoopUnrollAnalysis = true {C2 pd product} {default} bool SuperWordReductions = true {C2 product} {default} bool SuppressFatalErrorMessage = false {product} {default} uintx SurvivorPadding = 3 {product} {default} uintx SurvivorRatio = 8 {product} {default} double SweeperThreshold = 0.500000 {product} {default} uintx TLABAllocationWeight = 35 {product} {default} uintx TLABRefillWasteFraction = 64 {product} {default} size_t TLABSize = 0 {product} {default} bool TLABStats = true {product} {default} uintx TLABWasteIncrement = 4 {product} {default} uintx TLABWasteTargetPercent = 1 {product} {default} uintx TargetPLABWastePct = 10 {product} {default} uintx TargetSurvivorRatio = 50 {product} {default} uintx TenuredGenerationSizeIncrement = 20 {product} {default} uintx TenuredGenerationSizeSupplement = 80 {product} {default} uintx TenuredGenerationSizeSupplementDecay = 2 {product} {default} intx ThreadPriorityPolicy = 0 {product} {default} bool ThreadPriorityVerbose = false {product} {default} intx ThreadStackSize = 0 {pd product} {default} uintx ThresholdTolerance = 10 {product} {default} intx Tier0BackedgeNotifyFreqLog = 10 {product} {default} intx Tier0InvokeNotifyFreqLog = 7 {product} {default} intx Tier0ProfilingStartPercentage = 200 {product} {default} intx Tier23InlineeNotifyFreqLog = 20 {product} {default} intx Tier2BackEdgeThreshold = 0 {product} {default} intx Tier2BackedgeNotifyFreqLog = 14 {product} {default} intx Tier2CompileThreshold = 0 {product} {default} intx Tier2InvokeNotifyFreqLog = 11 {product} {default} intx Tier3BackEdgeThreshold = 60000 {product} {default} intx Tier3BackedgeNotifyFreqLog = 13 {product} {default} intx Tier3CompileThreshold = 2000 {product} {default} intx Tier3DelayOff = 2 {product} {default} intx Tier3DelayOn = 5 {product} {default} intx Tier3InvocationThreshold = 200 {product} {default} intx Tier3InvokeNotifyFreqLog = 10 {product} {default} intx Tier3LoadFeedback = 5 {product} {default} intx Tier3MinInvocationThreshold = 100 {product} {default} intx Tier4BackEdgeThreshold = 40000 {product} {default} intx Tier4CompileThreshold = 15000 {product} {default} intx Tier4InvocationThreshold = 5000 {product} {default} intx Tier4LoadFeedback = 3 {product} {default} intx Tier4MinInvocationThreshold = 600 {product} {default} bool TieredCompilation = true {pd product} {default} intx TieredCompileTaskTimeout = 50 {product} {default} intx TieredRateUpdateMaxTime = 25 {product} {default} intx TieredRateUpdateMinTime = 1 {product} {default} intx TieredStopAtLevel = 4 {product} {default} bool TimeLinearScan = false {C1 product} {default} ccstr TraceJVMTI = {product} {default} intx TrackedInitializationLimit = 50 {C2 product} {default} bool TrapBasedNullChecks = false {pd product} {default} bool TrapBasedRangeChecks = false {C2 pd product} {default} intx TypeProfileArgsLimit = 2 {product} {default} uintx TypeProfileLevel = 111 {pd product} {default} intx TypeProfileMajorReceiverPercent = 90 {C2 product} {default} intx TypeProfileParmsLimit = 2 {product} {default} intx TypeProfileWidth = 2 {product} {default} intx UnguardOnExecutionViolation = 0 {product} {default} bool UseAES = true {product} {default} intx UseAVX = 3 {ARCH product} {default} bool UseAdaptiveGenerationSizePolicyAtMajorCollection = true {product} {default} bool UseAdaptiveGenerationSizePolicyAtMinorCollection = true {product} {default} bool UseAdaptiveNUMAChunkSizing = true {product} {default} bool UseAdaptiveSizeDecayMajorGCCost = true {product} {default} bool UseAdaptiveSizePolicy = true {product} {default} bool UseAdaptiveSizePolicyFootprintGoal = true {product} {default} bool UseAdaptiveSizePolicyWithSystemGC = false {product} {default} bool UseAddressNop = true {ARCH product} {default} bool UseBASE64Intrinsics = true {product} {default} bool UseBMI1Instructions = true {ARCH product} {default} bool UseBMI2Instructions = true {ARCH product} {default} bool UseBiasedLocking = false {product} {default} bool UseBimorphicInlining = true {C2 product} {default} bool UseCLMUL = true {ARCH product} {default} bool UseCMoveUnconditionally = false {C2 product} {default} bool UseCodeAging = true {product} {default} bool UseCodeCacheFlushing = true {product} {default} bool UseCompiler = true {product} {default} bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} bool UseCompressedOops = true {product lp64_product} {ergonomic} bool UseCondCardMark = false {product} {default} bool UseCountLeadingZerosInstruction = true {ARCH product} {default} bool UseCountTrailingZerosInstruction = true {ARCH product} {default} bool UseCountedLoopSafepoints = true {C2 product} {default} bool UseCounterDecay = true {product} {default} bool UseDivMod = true {C2 product} {default} bool UseDynamicNumberOfCompilerThreads = true {product} {default} bool UseDynamicNumberOfGCThreads = true {product} {default} bool UseEmptySlotsInSupers = true {product} {default} bool UseFMA = true {product} {default} bool UseFPUForSpilling = true {C2 product} {default} bool UseFastJNIAccessors = true {product} {default} bool UseFastStosb = false {ARCH product} {default} bool UseG1GC = true {product} {ergonomic} bool UseGCOverheadLimit = true {product} {default} bool UseHeavyMonitors = false {product} {default} bool UseInlineCaches = true {product} {default} bool UseInterpreter = true {product} {default} bool UseJumpTables = true {C2 product} {default} bool UseLargePages = false {pd product} {default} bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} bool UseLoopCounter = true {product} {default} bool UseLoopInvariantCodeMotion = true {C1 product} {default} bool UseLoopPredicate = true {C2 product} {default} bool UseMaximumCompactionOnSystemGC = true {product} {default} bool UseNUMA = false {product} {default} bool UseNUMAInterleaving = false {product} {default} bool UseNewLongLShift = false {ARCH product} {default} bool UseNotificationThread = true {product} {default} bool UseOSErrorReporting = false {product} {default} bool UseOnStackReplacement = true {pd product} {default} bool UseOnlyInlinedBimorphic = true {C2 product} {default} bool UseOptoBiasInlining = false {C2 product} {default} bool UsePSAdaptiveSurvivorSizePolicy = true {product} {default} bool UseParallelGC = false {product} {default} bool UsePerfData = true {product} {default} bool UsePopCountInstruction = true {product} {default} bool UseProfiledLoopPredicate = true {C2 product} {default} bool UseRTMDeopt = false {ARCH product} {default} bool UseRTMLocking = false {ARCH product} {default} bool UseSHA = true {product} {default} intx UseSSE = 4 {ARCH product} {default} bool UseSSE42Intrinsics = true {ARCH product} {default} bool UseSerialGC = false {product} {default} bool UseSharedSpaces = true {product} {default} bool UseShenandoahGC = false {product} {default} bool UseSignalChaining = true {product} {default} bool UseStoreImmI16 = false {ARCH product} {default} bool UseStringDeduplication = false {product} {default} bool UseSubwordForMaxVector = true {C2 product} {default} bool UseSuperWord = true {C2 product} {default} bool UseTLAB = true {product} {default} bool UseThreadPriorities = true {pd product} {default} bool UseTypeProfile = true {product} {default} bool UseTypeSpeculation = true {C2 product} {default} bool UseUnalignedLoadStores = true {ARCH product} {default} bool UseVectorCmov = false {C2 product} {default} bool UseXMMForArrayCopy = true {product} {default} bool UseXMMForObjInit = true {ARCH product} {default} bool UseXmmI2D = false {ARCH product} {default} bool UseXmmI2F = false {ARCH product} {default} bool UseXmmLoadAndClearUpper = true {ARCH product} {default} bool UseXmmRegToRegMoveAll = true {ARCH product} {default} bool UseZGC = false {product} {default} intx VMThreadPriority = -1 {product} {default} intx VMThreadStackSize = 0 {pd product} {default} intx ValueMapInitialSize = 11 {C1 product} {default} intx ValueMapMaxLoopSize = 8 {C1 product} {default} intx ValueSearchLimit = 1000 {C2 product} {default} bool VerifySharedSpaces = false {product} {default} uintx YoungGenerationSizeIncrement = 20 {product} {default} uintx YoungGenerationSizeSupplement = 80 {product} {default} uintx YoungGenerationSizeSupplementDecay = 8 {product} {default} size_t YoungPLABSize = 4096 {product} {default} double ZAllocationSpikeTolerance = 2.000000 {product} {default} double ZCollectionInterval = 0.000000 {product} {default} double ZFragmentationLimit = 25.000000 {product} {default} size_t ZMarkStackSpaceLimit = 8589934592 {product} {default} bool ZProactive = true {product} {default} bool ZUncommit = true {product} {default} uintx ZUncommitDelay = 300 {product} {default} bool ZeroTLAB = false {product} {default} 2025-01-11T17:01:46.856-06:00 INFO 39876 --- [demo] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2025-01-11T17:01:46.859-06:00 INFO 39876 --- [demo] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2025-01-11T17:01:46.859-06:00 INFO 39876 --- [demo] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2025-01-11T17:01:46.866-06:00 INFO 39876 --- [demo] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' > Task :check > Task :build BUILD SUCCESSFUL in 1m 2s 8 actionable tasks: 8 executed |
- Line 14: marks the start of all JVM flags. As you saw here, there are lots of options. Always refer to the documentation when adjusting the value.
- Line 41: the “
AlwaysPreTouch
” defaults to disabled. - Line 70, 71: the “
CICompilerCountPerCPU
” is enabled by default and the “CICompilerCount
” value is 4. - Line 83: the “
CompileThreshold
” has a default value of 10000. - Line 87: the “
CompressedClassSpaceSize
” defines the maximum memory allocated for storing class metadata in the metaspace when using compressed class pointers. The value is 1073741824 bytes. - Line 91: the “
CrashOnOutOfMemoryError
” option is disabled by default. - Line 125: the “
ExitOnOutOfMemoryError
” option is disabled by default. - Line 171: the “
HeapDumpOnOutOfMemoryError
” option is enabled with the “true
” value. - Line 172: the “
HeapDumpPath
” option is set to the “heapdump.hprof
” string value. - Line 184: the “
InitialRAMPercentage
” option defines the initial heap size as percentages of the system’s available memory. The value is 1.5625%. - Line 223: the “
MaxDirectMemorySize
” option defines the amount of memory that can be reserved for Direct Byte Buffers. The default value is 0. - Line 227: the “
MaxHeapFreeRatio
” option defines the maximum percentage of how much free space is maintained in the heap after a GC cycle. The default value is 70%. - Line 228: the “
MaxHeapSize
” size is 33554432 bytes as customized in thetest
task configured in thebuild.gradle
file. - Line 230: the “
MaxInlineSize
” has a default value of 35. - Line 244: the “
MaxRAMPercentage
” option defines the maximum heap size as percentages of the system’s available memory. The value is 25%. - Line 250: the “
MetaspaceSize
” defines the initial size of the metaspace. The value is 22020096 bytes. - Line 253: the “
MinHeapFreeRatio
” option defines the minimum percentage of how much free space is maintained in the heap after a GC cycle. The default value is 40%. - Line 254: the “
MinHeapSize
” size is 8388608 bytes. This is used internally by JVM for the smallest heap that can be used during execution. - Line 331: the “
PrintCompilation
” is disabled by default. - Line 338: the “
PrintGCDetails
” is disabled by default. - Line 365: the “
ReservedCodeCacheSize
” value is 251658240. - Line 478: the “
UseCompressedClassPointers
” is enabled by default. - Line 504: the “
UseMaximumCompactionOnSystemGC
” is enabled by default.
7. JConsole Memory Monitoring Example
In this step, I will capture the memory usage of the JVM via JConsole
utility provided with JDK.
As you saw here, the “VM Summary
” tab outlines the maximum heap size, garbage collector settings, VM arguments, etc.
8. Conclusion
In this article, I explored advanced JVM options via a gradle spring boot application by configuring its test
task with a few advanced JVM options. I also monitored JVM memory via Jconsole. It’s good to monitor the JVM while adjusting the option values.
9. Download
This was an example of a gradle project which included advanced JVM options in the test
task.
You can download the full source code of this example here: Explaining Advanced JVM Options