引用计数法
可达性分析算法
GC Roots
的对象作为起点,从这个节点向下搜索,节点走过的路径成为引用链,当一个对象到GC Roots没有引用链的话,那么说明该对象要被回收了。Object6~Object10
之间虽有引用关系,但是不能到达GC Roots,所以,它们就是需要被回收的对象。对象可以被回收,但是不一定就代表一定会回收。上述四种引用,引用强度逐渐减弱
总结:使用软引用较多,因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统运行安全,防止内存溢出等问题产生
如果没有任何对象引用的话,那么就是废弃常量
满足下面三个条件才判定是无用的类:
标记-清除算法
分为标记,清除阶段。先标记不需要回收的对象,标记完成后,统一回收掉所有没被标记的对象。
存在问题:1. 效率问题;2. 空间问题(会产生大量不连续的碎片)
标记-复制算法
意义:为了解决效率问题
思想:将内存分为大小相同的两块,每次只使用其中一块。这一块使用完后,标记存活的对象复制到另一块去,然后把使用的空间全部清理。
图解:
但依然存在下面这些问题:
○ 可用内存变小:可用内存缩小为原来的一半。
○ 不适合老年代:如果存活对象数量比较大,复制性能会变得很差
标记-整理算法
思想:先标记不需要回收的对象,然后将这些存活对象向一端移动,最后直接清理掉边界以外的内存
图解:
分代收集算法(当前虚拟机采用的算法)
思想:根据对象存活周期将内存分为几块。一般将Java堆分为新生代和老年代,然后根据各个代的情况选择合适的回收算法
举例:新生代会有大量对象死去,可以选择标记-复制
算法。老年代对象存活几率高,没有额外的空间对它进行分配担保,所以必须选择标记-清除
或者标记-整理
算法
如果说垃圾收集算法是方法论的话,那么垃圾收集器就是内存回收的具体实现