手动GC 易产生内存泄漏,直到内存溢出
垃圾回收算法
引用计数
- 无法处理循环引用
- 每次引用产生和消除,都伴随一次加或减法运算,有一定性能影响
标记清除
现代垃圾回收算法的思想基础
回收后的空间是不连续的
,之后在不连续的内存空间中分配的效率要低于连续的空间
经典标记复制
解决标记清除算法内存回收后不连续的问题而衍生
- 可用内存折半
- 存活对象较多时,要复制大量对象,对效率也有影响
jvm
JVM 很多垃圾回收器都用到标记复制思想,为解决经典标记复制算法中内存折半问题,JVM 将内存划分为 3 个区
from 和 to 大小相同,地位相等,且可角色互换
from 和 to 也被称为 survivor 空间,即幸存者空间,用于存放未被回收的对象
GC 时,从根节点出发,标记 eden 和 from 区所有存活对象,然后将这些对象复制到 to 区。而下次进行垃圾回收时,to 和 from 区角色互换,将 to 区 和 eden 区的幸存对象复制到 from 区
通过这种方法,解决经典标记复制算法中内存折半问题
通过调整 eden 区,from 区和 to 区的比例,来控制内存的利用率
标记压缩
新生代:
复制算法的高效性建立在存活对象少、垃圾对象多的前提下
老年代:
大部分对象都是存活对象,再用复制算法, 复制成本高
和标记清除一样, 可达标记,但之后, 不只清理未标记的对象, 而将所有的存活对象压缩到内存的一端,之后, 清理边界外所有的空间
既避免了碎片的产生, 又不需要两块相同的内存空间,性价比高
所以标记复制算法和标记压缩算法分别代表了空间换时间和时间换空间思想,并分别活跃在各自擅长的场景中