java G1 垃圾收集器:为什么幸存者空间总是满的?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33535396/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
G1 Garbage Collector: Why survivor space is always full?
提问by Neo
Here is the output of jmap -heap
command:
这是jmap -heap
命令的输出:
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
.
我已经执行了很多次,我发现 的值capacity
总是等于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)
我的问题是为什么幸存者空间总是满的(而且很小)?我已指定-Xmx2200m -Xms2200m -Xmn1100m
. (我预计survivor空间应该是220M,这意味着survivor区应该有更多的空间)
-- update--
- 更新 -
Full output of jheap:
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.
采纳答案by Ravindra babu
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
当您停止自定义某些参数时,G1GC 是有效的。我建议删除
Xmn
(年轻一代)设置。设置不同的值
-Xms
和-Xmx
区域大小应配置为最大堆内存大小 / 2048。对于 4G 堆,2 MB 应该是区域大小,对于 2 GB 堆,1 MB 应该是理想的区域大小。
要配置的关键参数:
-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n
除了-Xms and -Xmx
Have a look at this SE postand infoQ articlefor more details.
Recommendation from Oracle
甲骨文的推荐
When you evaluate and fine-tune G1 GC, keep the following recommendations in mind:
在评估和微调 G1 GC 时,请记住以下建议:
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.
年轻代大小:避免使用 -Xmn 选项或任何或其他相关选项(例如 -XX:NewRatio)显式设置年轻代大小。修复年轻代的大小会覆盖目标暂停时间目标。
暂停时间目标:当您评估或调整任何垃圾收集时,总是存在延迟与吞吐量的权衡。
回答by Pushkar
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).
我最好的猜测是您的应用程序正在创建大量对象,而 Eden Space 很快就会填满(或者您的应用程序正在创建许多在 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.
在 Young GC 期间,活动对象将始终移动到幸存者空间之一。对象将被移动到 Old Gen,只有当对象足够老或者不是所有来自 Eden Space 的对象都无法放入选定的幸存者空间时。
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.
您是否介意分享您正在尝试解决的真正问题,或者您只是想知道为什么幸存者空间已满。