話說我這是直接從Oracle拷貝下來的文檔,希望不會有版權問題。(侵刪)
Oracle官方鏈接:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html
話說沒有仔細看,原來這裏還有後續的content,補一個。
10 Garbage-First Garbage Collector Tuning
As described in the section Garbage-First Garbage Collector, the G1 GC is a regionalized and generational garbage collector, which means that the Java object heap (heap) is divided into a number of equally sized regions. Upon startup, the Java Virtual Machine (JVM) sets the region size. The region sizes can vary from 1 MB to 32 MB depending on the heap size. The goal is to have no more than 2048 regions. The eden, survivor, and old generations are logical sets of these regions and are not contiguous.
The G1 GC has a pause time target that it tries to meet (soft real time). During young collections, the G1 GC adjusts its young generation (eden and survivor sizes) to meet the soft real-time target. See the sections Pauses and Pause Time Goal in Garbage-First Garbage Collector for information about why the G1 GC takes pauses and how to set pause time targets.
During mixed collections, the G1 GC adjusts the number of old regions that are collected based on a target number of mixed garbage collections, the percentage of live objects in each region of the heap, and the overall acceptable heap waste percentage.
The G1 GC reduces heap fragmentation by incremental parallel copying of live objects from one or more sets of regions (called Collection Sets (CSet)s) into one or more different new regions to achieve compaction. The goal is to reclaim as much heap space as possible, starting with those regions that contain the most reclaimable space, while attempting to not exceed the pause time goal (garbage first).
The G1 GC uses independent Remembered Sets (RSets) to track references into regions. Independent RSets enable parallel and independent collection of regions because only a region's RSet must be scanned for references into that region, instead of the whole heap. The G1 GC uses a post-write barrier to record changes to the heap and update the RSets.
Garbage Collection Phases
Apart from evacuation pauses (see the section Allocation (Evacuation) Failure in Garbage-First Garbage Collector) that compose the stop-the-world (STW) young and mixed garbage collections, the G1 GC also has parallel, concurrent, and multiphase marking cycles. G1 GC uses the snapshot-at-the-beginning (SATB) algorithm, which logically takes a snapshot of the set of live objects in the heap at the start of a marking cycle. The set of live objects also includes objects allocated since the start of the marking cycle. The G1 GC marking algorithm uses a pre-write barrier to record and mark objects that are part of the logical snapshot.
Young Garbage Collections
Mixed Garbage Collections
Upon successful completion of a concurrent marking cycle, the G1 GC switches from performing young garbage collections to performing mixed garbage collections. In a mixed garbage collection, the G1 GC optionally adds some old regions to the set of eden and survivor regions that will be collected. The exact number of old regions added is controlled by a number of flags (see "Taming Mixed Garbage Collectors" in the section Recommendations). After the G1 GC collects a sufficient number of old regions (over multiple mixed garbage collections), G1 reverts to performing young garbage collections until the next marking cycle completes.
Phases of the Marking Cycle(劃重點,G1垃圾回收器的主要步驟)
The marking cycle has the following phases:
Important Defaults
The G1 GC is an adaptive garbage collector with defaults that enable it to work efficiently without modification. Table 10-1, "Default Values of Important Options for G1 Garbage Collector" lists of important options and their default values in Java HotSpot VM, build 24. You can adapt and tune the G1 GC to your application performance needs by entering the options in Table 10-1, "Default Values of Important Options for G1 Garbage Collector" with changed settings on the JVM command line.
Table 10-1 Default Values of Important Options for G1 Garbage Collector
Option and Default Value | Option |
---|---|
Sets the percentage of the heap to use as the minimum for the young generation size. The default value is 5 percent of your Java heap.Foot1 This is an experimental flag. See How to Unlock Experimental VM Flags for an example. This setting replaces the |
|
|
Sets the percentage of the heap size to use as the maximum for young generation size. The default value is 60 percent of your Java heap.Footref1 This is an experimental flag. See How to Unlock Experimental VM Flags for an example. This setting replaces the |
|
Sets the value of the STW worker threads. Sets the value of If there are more than eight logical processors, sets the value of n to approximately 5/8 of the logical processors. This works in most cases except for larger SPARC systems where the value of n can be approximately 5/16 of the logical processors. |
|
Sets the number of parallel marking threads. Sets |
|
Sets the Java heap occupancy threshold that triggers a marking cycle. The default occupancy is 45 percent of the entire Java heap. |
|
Sets the occupancy threshold for an old region to be included in a mixed garbage collection cycle. The default occupancy is 85 percent.Footref1 This is an experimental flag. See How to Unlock Experimental VM Flags for an example. This setting replaces the |
|
Sets the percentage of heap that you are willing to waste. The Java HotSpot VM does not initiate the mixed garbage collection cycle when the reclaimable percentage is less than the heap waste percentage. The default is 5 percent.Footref1 |
|
Sets the target number of mixed garbage collections after a marking cycle to collect old regions with at most |
|
Sets an upper limit on the number of old regions to be collected during a mixed garbage collection cycle. The default is 10 percent of the Java heap.Footref1 |
|
Sets the percentage of reserve memory to keep free so as to reduce the risk of to-space overflows. The default is 10 percent. When you increase or decrease the percentage, make sure to adjust the total Java heap by the same amount.Footref1 |
Footnote1This setting is not available in Java HotSpot VM build 23 or earlier.
How to Unlock Experimental VM Flags(這裏有解鎖體驗功能的選項,jdk8也可以開啓G1垃圾回收器!!)
java -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10 -XX:G1MaxNewSizePercent=75 G1test.jar
Recommendations(注意!!!)
When you evaluate and fine-tune G1 GC, keep the following recommendations in mind:
-
-
Pause Time Goals: When you evaluate or tune any garbage collection, there is always a latency versus throughput trade-off(如果設置垃圾回收相關參數,那麼總是會在吞吐量和暫停時間之間權衡). The G1 GC is an incremental garbage collector with uniform pauses, but also more overhead on the application threads. The throughput goal for the G1 GC is 90 percent application time and 10 percent garbage collection time(吞吐量就是業務時間佔總應用程序運行時間的比例,總應用程序運行時間=業務時間+GC時間). Compare this to the Java HotSpot VM parallel collector. The throughput goal of the parallel collector is 99 percent application time and 1 percent garbage collection time. Therefore, when you evaluate the G1 GC for throughput, relax your pause time target(如果更加註重吞吐量,就應該放鬆低延時的要求). Setting too aggressive a goal indicates that you are willing to bear an increase in garbage collection overhead, which has a direct effect on throughput(設置一個具有挑戰性的低延時時間,表明你將忍受增加的垃圾回收開銷,這會直接影響到吞吐量). When you evaluate the G1 GC for latency, you set your desired (soft) real-time goal, and the G1 GC will try to meet it. As a side effect, throughput may suffer(如果注重低延時,G1會嘗試滿足低延時要求,但是吞吐量可能會受影響。也就是如果低延時,那麼就可能會導致多次低延遲的垃圾回收,導致總的垃圾回收時間變長). See the section Pause Time Goal in Garbage-First Garbage Collector for additional information.
-
Taming Mixed Garbage Collections: Experiment with the following options when you tune mixed garbage collections. See the section Important Defaults for information about these options:
-
-XX:InitiatingHeapOccupancyPercent
: Use to change the marking threshold. -
-XX:G1MixedGCLiveThresholdPercent
and-XX:G1HeapWastePercent
: Use to change the mixed garbage collection decisions. -
-XX:G1MixedGCCountTarget
and-XX:G1OldCSetRegionThresholdPercent
: Use to adjust the CSet for old regions.
-
Overflow and Exhausted Log Messages
-
924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space exhausted), 0.1957310 secs]
-
924.897: [GC pause (G1 Evacuation Pause) (mixed) (to-space overflow), 0.1957310 secs]
To alleviate the problem, try the following adjustments:
See the section Important Defaults for a description of these options.