1、比例
JVM内存新生代Eden区和Survivor区的比例是8:1:1,其中,Eden区占用80%,Survivor占用20%,并且划分为大小相同的两部分,这样划分的原因是为了解决内存碎片的问题。
2、为什么JVM新生代需要两个Survivor区?
JVM需要两个Survivor区其实是基于新生代的复制收集算法。
如果只有一个Survivor会发生什么?
如果只存在一个Survivor,Eden满了之后将数据清除,存活的对象转移至Survivor,好像没有问题。但是第二次GC,根据复制收集算法,要将Eden和Survivor存活的对象复制到一个Survivor中,并没有第二个Survivor来存放这些存活的对象。那就会有问题,只能Survivor中的数据不清理,只把Eden中存活的对象放入Survivor中,这会导致Survivor中空间急剧升高,频繁GC,同时Survivor中很多不必要的对象无法清理,继续占用空间。
如果做一些改良会怎样?
因为将eden区的存活对象复制到survivor区时,必须保证survivor区是空的,如果survivor区中已有上次复制的存活对象时,这次再复制的对象肯定和上次的内存地址是不连续的,会产生内存碎片,浪费survivor空间。
而如果有两个survivor区,第一次GC后,把eden区和survivor0区一起复制到survivor1区,然后清空survivor0和eden区,此时survivor1非空,survivor0和eden区为空,下一次GC时把survivor0和survivor1交换,这样就能保证向survivor区复制时始终都有一个survivor区是空的,也就能保证新对象能始终在eden区出生了。