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

Java G1垃圾收集器:为什么幸存者空间总是满的?,java,memory-management,garbage-collection,jvm,Java,Memory Management,Garbage Collection,Jvm,下面是jmap-heap命令的输出: Survivor Space: regions = 52 capacity = 54525952 (52.0MB) used = 54525952 (52.0MB) free = 0 (0.0MB) 100.0% used 我已经执行了很多次,我发现容量的值总是等于使用的 我的问题是为什么幸存者空间总是满的(而且很小)?我已经指定了-Xmx2200m-Xms2200m-Xmn1100m。 (我预计幸存者空间应

下面是
jmap-heap
命令的输出:

Survivor Space:
   regions  = 52
   capacity = 54525952 (52.0MB)
   used     = 54525952 (52.0MB)
   free     = 0 (0.0MB)
   100.0% used
我已经执行了很多次,我发现
容量的值总是等于
使用的

我的问题是为什么幸存者空间总是满的(而且很小)?我已经指定了
-Xmx2200m-Xms2200m-Xmn1100m
。 (我预计幸存者空间应该是220米,这意味着幸存者区域应该有更多的空间)

--更新--

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.

我最好的猜测是,您的应用程序正在创建大量对象,而Eden空间很快就被填满了(或者您的应用程序正在创建大量在年轻GC中存活的长寿对象)

在年轻GC期间,活动对象将始终移动到幸存者空间之一。只有当对象的年龄足够大,或者并非来自伊甸园空间的所有对象都无法容纳到选定的幸存者空间中时,对象才会移动到Old Gen

您是否介意分享您试图解决的真正问题是什么,或者您只是想知道为什么幸存者空间已满。

我的观察结果

  • 当您停止自定义某些参数时,G1GC是有效的。我建议删除
    Xmn
    (年轻一代)设置

  • 设置
    -Xms
    -Xmx
    的不同值

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

  • 要配置的关键参数:
    -XX:G1HeapRegionSize=n,XX:MaxGCPauseMillis=m,-XX:ParallelGCThreads=n,-XX:congcthreads=n
    除了
    -Xms和-Xmx

  • 看看这个,了解更多细节

    推荐自

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

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

    暂停时间目标:当您评估或调优任何垃圾收集时,总是存在延迟与吞吐量的权衡


    嘿,尼奥,你介意输出jmap输出的其余部分吗?@JonathanThoms当然,事实上,我的应用程序没有问题。我只是想弄清楚G1GC是否真的是web应用程序的更好选择。您应该启用GC日志并配置您的应用程序。在GC日志上使用GC查看器会让您有更好的想法。