现在的JVM的新生代内存中,除了Eden区,还有两个Survivor区。那为什么要这样设置呢?
这和新生代的垃圾回收算法是息息相关的。

复制算法

复制算法是新生代的垃圾收集收集算法,基本思路是将新生代分为两个大小一样的内存区域,每次新对象会放置在其中的一块区域内。当该区域的大小不足以继续分配对象时,此时就会促发Minor GC,首先将存活的对象标记出来,然后将存活的对象转移到另一块内存区域中,这样可以比较紧凑地将对象排列在一起,减小了内存碎片。同时之前那块内存可以一次回收掉所有的对象。
复制算法主要是减少了内存碎片

**但是每次只能用一半的新生代,对内存的使用效率太低了!**

复制算法的优化:Eden区和Survivor区

其实大多数对象存活周期非常短的,可能一次新生代垃圾回收,99%的对象都被回收了,所以真正的复制算法会进行优化,把新生代内存分为三块:一块Eden区和两块Survivor区。比例可以是8:1:1
平时对象的分配都是分配在Eden区,当Eden区快满时触发垃圾回收,将存活的对象转移到其中一块Survivor区中,然后对Eden区进行清除。等到Eden区再次填满时,Eden区域的存活对象和使用过的Survivor区域的存活对象转移到空的Survivor区域中,然后清除Eden区和之前的Survivor区。就这样始终保存一块Survivor是空的等待接受存活对象,循环使用三块内存。这样可用内存就变成了90%,而不是之前的50%
这也就是为什么新生代要划分为三块区域,这样做既能减少内存碎片,也能提高内存的使用效率