首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >G1垃圾收集器:为什么幸存者空间总是满的?

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

Stack Overflow用户
提问于 2015-11-05 09:59:13
回答 2查看 14.6K关注 0票数 7

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

代码语言:javascript
复制
Survivor Space:
   regions  = 52
   capacity = 54525952 (52.0MB)
   used     = 54525952 (52.0MB)
   free     = 0 (0.0MB)
   100.0% used

我已经执行过很多次了,我发现capacity的值总是等于used

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

-更新--

jheap的完整输出:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-11 22:13:13

我的观察。

当您停止自定义某些参数时,

  1. G1GC是有效的。我建议删除Xmn (年轻一代)设置。

-Xmx

  1. 设置不同的值

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

需要配置的

  1. 关键参数:-Xms and -Xmx

以外的-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n

请查看此SE postinfoQ article以了解更多详细信息。

来自Oracle的推荐

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-12-11 22:01:16

我最好的猜测是,您的应用程序正在创建大量对象,并且Eden Space很快被填满(或者您的应用程序正在创建大量存活时间较长的对象,这些对象在Young GC中幸存下来)。

在年轻的GC期间,活动对象将始终被移动到其中一个幸存者空间。只有当对象足够陈旧,或者不是所有来自伊甸园空间的对象都适合选定的幸存者空间时,才会将对象移动到旧世代。

你介意分享你正在尝试解决的真正问题是什么,还是你只是好奇地想知道为什么幸存者空间是满的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33535396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档