JVM刚启动时,新创建的对象先在eden区分配,第一次MGC时,eden区中存活的对象年龄加1,并移动到S0区。第二次MGC时,eden区和S0区中存活的对象年龄各加1,并将eden区和S0区存活的对象都移动到S1区,清空eden区和S0区,将S1区和S0区的角色互换(是角色互换而不是内存数据的复制)。接下来的MGC都是这样,同时回收eden区和S0区,将存活的对象移动到S1区,清空eden区和S0区,将S1区和S0区的角色互换。
S区的存在是为了容纳eden区垃圾收集后的存活对象,接收完这些存活对象后可以清空eden区为下一次对象创建做准备。而有两个S区(S0区和S1区)的意义就是eden区和S0区之间需要一个缓冲的内存,来承载eden区和S0区存活的对象,这样也能避免eden区和S0区的空间碎片化(基于标记复制算法)。
网友评论