为什么一个Survivor区不行?第一局部中,咱们晓得了必须设置Survivor区。假如当初只有一个survivor区,咱们来模仿一下流程:刚刚新建的对象在Eden中,一旦Eden满了,触发一次Minor GC,Eden中的存活对象就会被挪动到Survivor区。这样持续循环上来,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很显著这两局部对象所占有的内存是不间断的,也就导致了内存碎片化。我绘制了一幅图来表明这个过程。其中色块代表对象,红色框别离代表Eden区(大)和Survivor区(小)。Eden区天经地义大一些,否则新建对象很快就导致Eden区满,进而触发Minor GC,有悖于初衷。

碎片化带来的危险是极大的,重大影响Java程序的性能。堆空间被分布的对象占据不间断的内存,最间接的后果就是,堆中没有足够大的间断内存空间,接下去如果程序须要给一个内存需要很大的对象分配内存。。。画面太美不敢看。。。这就好比咱们爬山的时候,背包里所有货色紧挨着放,最初就可能省出一块残缺的空间放相机。如果每件行李之间隔一点空隙乱放,很可能最初就要一路把相机挂在脖子上了。那么,牵强附会的,应该建设两块Survivor区,刚刚新建的对象在Eden中,经验一次Minor GC,Eden中的存活对象就会被挪动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程十分重要,因为这种复制算法保障了S1中来自S0和Eden两局部的存活对象占用间断的内存空间,防止了碎片化的产生)。S0和Eden被清空,而后下一轮S0与S1替换角色,如此周而复始。如果对象的复制次数达到16次,该对象就会被送到老年代中。下图中每局部的意义和上一张图一样,就不加正文了。

上述机制最大的益处就是,整个过程中,永远有一个survivor space是空的,另一个非空的survivor space无碎片。那么,Survivor为什么不分更多块呢?比方说分成三个、四个、五个?显然,如果Survivor区再细分上来,每一块的空间就会比拟小,很容易导致Survivor区满,因而,我认为两块Survivor区是通过衡量之后的最佳计划。原文:https://www.cnblogs.com/duanxz/p/6076662.html