JVM - 垃圾回收算法

JVM - 垃圾回收算法

这里只介绍垃圾回收算法的思想,不关注具体的算法细节
垃圾回收算法发展已经有很长的历史

问题一、怎么判定一个对象是垃圾对象?

解决这个问题的核心其实就是判定该对象有没有正在使用?

  1. 引用计数算法
  • 被引用了就计数加1.
  • 被释放了就计数就减1.
  • 如果计数是0,就说明没有被引用,就是垃圾对象,可以回收
    最大的问题就是循环引用的问题.

实践测试:我们的Java虚拟机是否也不能回收循环引用的问题?

  1. 可达性分析算法

GC Root到达对象没有路径就是垃圾对象


image.png
标记清除算法

这是垃圾回收算法最基础的算法

image.png

总结下:

  1. 标记和清除都需要遍历对象,效率不是很高
  2. 清除之后会导致很多内存碎片问题,使得下一次内存分配管理成本很高
复制算法

为了解决内存碎片的问题


image.png

总结下:

  1. 内存的利用效率变低,必须有额外内存作为备用
  2. 如果回收的对象比较少,每次拷贝的对象很消耗性能
  3. 适用垃圾比较少的情况
标记整理算法

结合标记清除和复制算法优点的优化算法

image.png

问题:那那种算法适合JVM的垃圾收集器?

  1. 主要看对象存活时间
  2. JVM根据对象存活时间不同采用分代回收··

你可能感兴趣的:(JVM - 垃圾回收算法)