S:Survivors
E:Eden
O:Old
如果 Eden 满了(触发一次MinorGC, 其中存活的对象)年轻代处理过程如下:
1.如果 S 相同年龄对象的总大小 > S 区总大小的 50%, 这些对象以及年龄大于这些对象的对象, S 区中这些对象将全部移动到 O 区.(只要触发 MinorGC 该条件处理过程必然触发)
2.如果条件 1 不成立, 原有 S 区这些对象全部继续保存在 S 区中, 如果原有 S 区剩余空间足够存放这批存活的对象, 那么存活对象进入 S 区.(处理结束)
3.如果条件 1 不成立, 原有 S 区这些对象全部继续保存在 S 区中, 如果原有 S 区剩余空间不足够存放这批存活的对象, 且这批对象的总大小 < S 区总大小, 那么原有 S 区所有对象移动到 O 区. 这批存活对象进入 S 区.(存活对象进入 S 区按空间申请先后,处理结束)
以 S 区总大小为 1024K 为例, 在同一次 E 区垃圾回收中存活的对象如下:
|- 50K
|- 300K
E 存活 |- 300K
|- 500K
|_ 100K
由于 500K + 上面的 650K > 1024K, 顾 500K 直接进入 O 区.最后 100K + 上面的 650K < 1024K, 顾最终结果 S 区大小为 750K.
4.如果这批存活对象中某个大小 > S 区总大小, 那么这个对象直接进入 O 区.(处理结束)