JVM内存模型中,为什么要区分新生代和老年代,对于新生代,为什么又要区分eden区和survial区?

62 阅读1分钟

image.png 关键点: 1.分清jvm的标准与实现 2.分代手机算法再g1是逻辑上的划分之前的垃圾回收器可以理解是物理上的 3.标记算法 4.内存连续空间

答案: 1.主流垃圾回收器CMS g1都使用了分代收集算法。

2.正常系统运行时会有海量临时对象产生,这些对象短期内大部分就会失效,对于这些对象我们把他们临时放到新生代。

3.新生代满了之后需要清理垃圾对象,我们会把有效对象赋值到老年代,以便后续继续使用。

4.为了更有效的区分哪些对象应该被复制到老年代,所以在新生代划分出了eden去和s0,s1区域

5.细化后的新生代内部被再次划分以便保证高速读写同时内存连续,

1.新对象会被保存在eden区(开始是空的所以内存连续),eden区满了会把有效对象赋值到s0(s0也是空的所以也是连续空间)。
2.清空eden区(再次写入时又是连续空间)
3.s0和s1在命名上互换原来的s1等待写入(空的)
4.eden区再次满了,重复上面步骤

6.eden区通过复制/清楚算法保证了读写连续性。(因为新生代的对象产生和销毁非常频繁,所以才采用了清空的方式)