G1收集器的S区为什么没有转换?

各位好,有个问题无法在网上找到答案,所以在这里提问一下。

按照原理,当E区占满并执行YGC后,应该把E区的对象放入S区,S区有两个,分为S1和S0,S区会在每次YGC之后用 to 和 from 标识不停设换,然后把对象放入其中一个S区,以此循环。而在实际应用中,我发现如果使用G1收集器时,E区满了之后并且执行YGC后,对象会直接进入S1区和O区,但每次YGC都只使用S1区,没有使用S0区,而且使用 jmap -heap pid 输出堆简要信息后,也只有一个S区信息,和其他收集的不一样,请问是什么原因导致使用G1收集器时S区没有轮流设换?

 

不好意思说的有点问题,我刚才想了想 G1 的内存模型和其他的内存模型不太一样。所以并没有 S0、S1 的说法。

https://zhuanlan.zhihu.com/p/59861022 具体可以看这篇文章。

其实应该是轮换了,因为 S1 和 S0 只是逻辑上区分的,物理上没有区分。你可以理解为,比如发生 YGC 的时候,将 E 区和 S1 中幸存的对象放到 S0,然后清空 E 区和 S1 的内存。这个过程结束以后,原来的 S0 就变成了 S1 而 S1 就变成了 S0。所以你能看到 S0 始终是空的。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632