JVM新生代只有一个Eden+S0 可以吗

JVM新生代只有一个Eden+S0 可以吗
XRJVM新生代只有一个Eden+S0 可以吗
先直接说答案:理论上可以,也能实现标记-复制算法。但工程上不可以,因为会大大浪费空间。
标记-复制算法下,新生代三个区域是怎么使用的:
- 初始时,Eden、S0、S1 都是空
- 对象都分配在 Eden区,如果Eden区快满了就触发垃圾回收,把 Eden区中的存活对象转移到一个块空的survivor区(S0),然后 Eden区清空。(一次youngGC结束)
- 再次分配新对象到 Eden,再次触发垃圾回收(此时不光标记 Eden,还需要标记S0了),然后将这两个区域存活的转移到 另一块空的survivor区(S1),清理S0、Eden区(一次youngGC结束)
- 再次分配新对象到 Eden,再次触发垃圾回收(此时不光标记 Eden,还需要标记S1了),然后将这两个区域存活的转移到 另一块空的survivor区(S0)
因此采用 Eden+S0+S1(8:1:1),可以保证JVM正常运行时,新生代的空间有9成可以存放对象,1成是空着的。
如果说只有两个区域,比如 Eden区和S0。那么由于标记复制算法的限制(必须由一块区域是空的)。每次只有一个区域是存放youngGC活下来的对象,一个区域是空的。
因为要轮流存放对象,那么比例应该就是1:1。那么在正常运行时,JVM新生代中只有一半的内存可以分配对象,另一半得空着。
如果说不想要有区域是空着的,那么就需要使用 标记-清除算法或者标记-整理算法,就会存在碎片和效率问题。而这与 新生代的设计初衷相违背(新生代会比较高频进行垃圾回收)
评论
匿名评论隐私政策












