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.
My observations.
G1GC is efficient when you stop customizing some of the parameters. I suggest to remove
Xmn
( young gen) setting.Set different values of
-Xms
and-Xmx
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.
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:
My best guess would be your application is creating lot of objects and Eden Space quickly fills up (or your application is creating lot of long living objects that survive Young GC).
During Young GC, live objects will always be moved to one of the survivor spaces. Objects will be moved to Old Gen, only if objects are aged enough or if not all objects from Eden Space can not fit into the selected survivor spaces.
Would you mind sharing what is the real problem you are trying to solve or you are just curious to know why survivor space is full.