GC回收算法
1、标记清除算法(Mark-Sweep算法)
先标记然后删除,这个算法效率不高。而且容易导致内存碎片多,难以找到连续足够大的内存片供使用。
2、复制算法(Copying)
将内存分为两块,一块是在使用的。这块使用到一定程度,开始回收。将里面还活着的对象复制到另一半中。让后清理整半块内存。缺点就是内存利用率不高,只有一半。而且存活对象多时候,复制也是很费劲的事。JVM 年轻代GC的具体实现,就是使用这个算法去gc对象。
3、分代收集算法-也是标志压缩算法-mark-compact
和标志清除算法,类似,只是删除后,还做内存移动,形成连续的内存块供调用。好处就是gc后有成片的内存块,缺点就是移动内存开销大。
JVM GC过程
Java堆内存可分配的空间有两个区域:年轻代和年老代。年轻代用以保存生存周期短的对象,而年老代则是保存生存周期长的对象。
新生代区又分为三个子区域:Eden,Survivor1,Survivor2。
垃圾回收的过程:如果新生代Eden区满了,则启动一轮新生代中的对象GC,生存下来(没有被回收掉)的Eden中的对象和Survivor1区中的对象一并复制到Survivor2中。两个Survivor区域是互相切换使用的(就是说,下次从Eden和Survivor2中复制到Survivor1中)。如果某个对象的年龄(每次GC所有生存下来的对象长一岁)超过某个阈值,或者Survivor2(下次是Survivor1)区域满了,则将对象移到老生代(Old区)。最终如果老生代也满了,就会启动full GC。