JVM - 垃圾回收算法
这里只介绍垃圾回收算法的思想,不关注具体的算法细节
垃圾回收算法发展已经有很长的历史
问题一、怎么判定一个对象是垃圾对象?
解决这个问题的核心其实就是判定该对象有没有正在使用?
- 引用计数算法
- 被引用了就计数加1.
- 被释放了就计数就减1.
- 如果计数是0,就说明没有被引用,就是垃圾对象,可以回收
最大的问题就是循环引用的问题.
实践测试:我们的Java虚拟机是否也不能回收循环引用的问题?
- 可达性分析算法
GC Root到达对象没有路径就是垃圾对象
标记清除算法
这是垃圾回收算法最基础的算法
总结下:
- 标记和清除都需要遍历对象,效率不是很高
- 清除之后会导致很多内存碎片问题,使得下一次内存分配管理成本很高
复制算法
为了解决内存碎片的问题
总结下:
- 内存的利用效率变低,必须有额外内存作为备用
- 如果回收的对象比较少,每次拷贝的对象很消耗性能
- 适用垃圾比较少的情况
标记整理算法
结合标记清除和复制算法优点的优化算法
问题:那那种算法适合JVM的垃圾收集器?
- 主要看对象存活时间
- JVM根据对象存活时间不同采用分代回收··