赞
踩
先标记出垃圾,然后再清除垃圾。
标记时利用可达性分析,可达的对象刨除,不可达的对象标记为垃圾,然后将其清除,即释放该对象所占的内存空间。
优点:简单,容易实现
缺点:可能会产生大量的内存碎片
例如,假设有五个对象占用五份内存,此时2,4为垃圾,则将其所占空间释放,空闲的空间就会和正在使用的空间穿插开了,变成一块块空间碎片。
但在代码中我们经常会申请一个连续的内存空间,如果碎片太多,总的剩余空间有50M,但是是由50个1M的空间碎片组成,如果我们想要申请一个3M的连续空间,则无法满足。
复制算法是将一整块内存划分为两份
只使用其中一份存储,在标记完垃圾之后,将不是垃圾的对象复制到另一份内存中,将之前的这一半内存全部回收。
优点:解决了内存碎片问题;
缺点:有局限性,如果需要复制的对象多,那么效率可能会很低;
内存只使用一半,利用率低;
类似于顺序表中删除中间元素的方式,标记整理是将后边的元素往前移动。
优点:内存利用率高,没有内存碎片
缺点:内存搬运操作频繁,效率不高
分代回收是将回收的过程分为了几个不同的场景,不同的场景下采取不同的回收方式。
基于一个经验规律,一个对象存活的时间越久,那么就认为这个对象继续存活的可能性就越大。(例如百度,腾讯之类的大公司,不会轻易倒闭一样)
举一个典型的分代回收的例子
根据对象躲过的GC的轮次(JVM会周期性的对内存进行可达性分析)将其划分为新生代和老年代,新生代中又包含伊甸区和两个幸存区。
大致流程:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。