G1 Garbage Collector: Why survivor space is always full?

15,147

My observations.

  1. G1GC is efficient when you stop customizing some of the parameters. I suggest to remove Xmn ( young gen) setting.

  2. Set different values of -Xms and -Xmx

  3. Region size should be configured as Maximum heap memory size / 2048. For 4G heap, 2 MB should be region size & for 2 GB heap, 1 MB should be ideal region size.

  4. key parameters to be configured : -XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n apart from -Xms and -Xmx

Have a look at this SE post and infoQ article for more details.

Recommendation from Oracle

When you evaluate and fine-tune G1 GC, keep the following recommendations in mind:

Young Generation Size: Avoid explicitly setting young generation size with the -Xmn option or any or other related option such as -XX:NewRatio. Fixing the size of the young generation overrides the target pause-time goal.

Pause Time Goals: When you evaluate or tune any garbage collection, there is always a latency versus throughput trade-off.

Share:
15,147
Neo
Author by

Neo

Eat Java.

Updated on June 04, 2022

Comments

  • Neo
    Neo almost 2 years

    Here is the output of jmap -heap command:

    Survivor Space:
       regions  = 52
       capacity = 54525952 (52.0MB)
       used     = 54525952 (52.0MB)
       free     = 0 (0.0MB)
       100.0% used
    

    I've executed it many times and I found that the value of capacity is alway equal to used.

    My question is why survivor space is alway full(and so small)? I've specified -Xmx2200m -Xms2200m -Xmn1100m. (I expect the survivor space should be 220M, which means there should be more space for survivor region)

    -- update--

    Full output of jheap:

    Garbage-First (G1) GC with 2 thread(s)
    
    Heap Configuration:
       MinHeapFreeRatio         = 40
       MaxHeapFreeRatio         = 70
       MaxHeapSize              = 2306867200 (2200.0MB)
       NewSize                  = 1153433600 (1100.0MB)
       MaxNewSize               = 1153433600 (1100.0MB)
       OldSize                  = 4194304 (4.0MB)
       NewRatio                 = 2
       SurvivorRatio            = 8
       MetaspaceSize            = 16777216 (16.0MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 4294963200 (4095.99609375MB)
       G1HeapRegionSize         = 1048576 (1.0MB)
    
    Heap Usage:
    G1 Heap:
       regions  = 14488
       capacity = 15191769088 (14488.0MB)
       used     = 1083703304 (1033.5000076293945MB)
       free     = 14108065784 (13454.499992370605MB)
       7.13348983730946% used
    G1 Young Generation:
    Eden Space:
       regions  = 988
       capacity = 1163919360 (1110.0MB)
       used     = 1035993088 (988.0MB)
       free     = 127926272 (122.0MB)
       89.009009009009% used
    Survivor Space:
       regions  = 45
       capacity = 47185920 (45.0MB)
       used     = 47185920 (45.0MB)
       free     = 0 (0.0MB)
       100.0% used
    G1 Old Generation:
       regions  = 2
       capacity = 1095761920 (1045.0MB)
       used     = 524296 (0.5000076293945312MB)
       free     = 1095237624 (1044.4999923706055MB)
       0.04784762003775419% used
    
    30424 interned Strings occupying 3027304 bytes.