注:本文针对Hot Spot虚拟机
一、分代收集
在很多时候,JVM中对象的生命周期差距较大,部分对象可能是“朝生夕死”的(大部分),而部分对象可能又是比较“命长”的(小部分)。所以根据对象生命周期的特点,我们将堆空间分为几个区域,比如新生代、老年代,在不同的分代可以采取不同的收集算法,以最大化效率。
二、新生代与复制算法
不考虑特殊情况,对象会优先分配到新生代,并且对象大多都是朝生夕死的,每次新生代GC都会有大批的对象死去,只有少量存活,所以新生代一般采取“复制算法”来进行垃圾收集。
复制算法的思想就是将内存空间划分为大小相等的两部分,每次只使用其中一块,当这块内存不足以容纳新对象的时候,就将存活的对象复制到另外一块上,然后将前一块内存空间中使用的内存一次性清理掉,这样在内存分配时就不用考虑内存碎片的情况了,既简单又高效。
三、一个eden和一个survivor
既然采取复制算法,那我们就需要把新生代内存空间进行划分。但是在新生代中的对象大多数都是短命的,如果将新生代划分为大小相等的两部分的话,就太浪费内存空间了,所以即使我们需要划分新生代空间,也并不需要按照1:1的标准来。既然大多数对象都是短命的,那么我们按照一个大空间、一个小空间来进行划分就好了嘛,这最好再增加一个可配置参数,让用户可以根据实际情况来进行调整。对象优先分配到大的那块空间,