G1垃圾收集器:为什么幸存者空间总是满的?

9
这是`jmap -heap`命令的输出结果:
Survivor Space:
   regions  = 52
   capacity = 54525952 (52.0MB)
   used     = 54525952 (52.0MB)
   free     = 0 (0.0MB)
   100.0% used

我已经执行了很多次,发现capacity的值总是等于used的值。
我的问题是为什么幸存者空间总是满的(而且很小)?我已经指定了-Xmx2200m -Xms2200m -Xmn1100m。(我希望幸存者空间应该是220M,这意味着应该有更多的空间用于幸存者区域)
-- 更新 --
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.

嘿Neo,你介意输出剩余的jmap输出吗? - entpnerd
@JonathanThoms 当然 - Neo
2个回答

5

我的观察。

  1. 当您停止自定义某些参数时,G1GC效率高。建议删除Xmn(young gen)设置。

  2. 设置不同的-Xms-Xmx值。

  3. Region大小应配置为最大堆内存大小/2048。对于4G堆,2 MB应该是区域大小。对于2 GB堆,1 MB应该是理想的区域大小。

  4. 要配置的关键参数:-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n除了-Xms和-Xmx之外。

查看此SE帖子infoQ文章以获取更多详细信息。

Oracle推荐

在评估和调整G1 GC时,请记住以下建议:

年轻代大小:避免使用-Xmn选项或任何其他相关选项(例如-XX:NewRatio)显式设置年轻代大小。固定年轻代的大小会覆盖目标暂停时间目标。

暂停时间目标:在评估或调整任何垃圾回收时,总是有延迟与吞吐量之间的权衡。


0

我最好的猜测是你的应用程序创建了大量对象,Eden空间很快就会填满(或者你的应用程序创建了许多长寿命对象,这些对象可以在Young GC中幸存下来)。

在Young GC期间,活动对象将始终移动到其中一个Survivor空间。只有当对象足够老化或者无法将Eden空间中的所有对象都放入所选的Survivor空间时,对象才会被移动到Old Gen。

您介意分享一下您正在尝试解决的真正问题,还是只是想知道为什么Survivor空间已满。


实际上,我的应用程序没有问题。我只是想弄清楚G1GC是否真的是Web应用程序的更好选择。 - Neo
你应该启用 GC 日志并对你的应用程序进行分析。使用 GC Viewer https://github.com/chewiebug/GCViewer 可以更好地理解 GC 日志。 - Pushkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接