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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 21:49:54  来源:igfitidea点击:

G1 Garbage Collector: Why survivor space is always full?

javamemory-managementgarbage-collectionjvm

提问by Neo

Here is the output of jmap -heapcommand:

这是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 capacityis 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.

我的观察。

  1. G1GC is efficient when you stop customizing some of the parameters. I suggest to remove Xmn( young gen) setting.

  2. Set different values of -Xmsand -Xmx

  3. 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.

  4. key parameters to be configured : -XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=napart from -Xms and -Xmx

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

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

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

  4. 要配置的关键参数:-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.

查看此SE 帖子infoQ 文章了解更多详细信息。

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.

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