垃圾收集算法
垃圾收集算法是内存回收的方法理论(理论方法,并未实际实现)
分代收集理论
JVM虚拟机的垃圾收集是采用分代收集算法,根据对象的存活周期的不同将内存分块。java将堆分为新生代和老年代,就可以根据不同年龄的不同特点选择合适的垃圾收集算法。
例如在新生代中,每次mGC都会造成大量的对象回收,只存在少里对象存活,只需要复制算法进行复制到幸存者区。
标记-复制算法
“复制”算法,它将内存分为大小相同的俩块,每次使用其中的一块。当使用的那块内存使用完后,就将还存活的对象复制到另一块,然后将之前使用的那块清理掉。就是每次内存回收都是堆内存中另一块进行回收。
流程
- 当使用内存块满时,标记存活对象,复制存活对象进入未使用内存块。
- 清理使用内存块,两个内存块切换使用状态。(循环)
缺点
:内存利用率过低,每次只有一半的内存被使用.
标记-清理算法
该算法分为两个阶段:
- 标记
- 第一种:标记所有存活对象(一般使用)
- 第二种:标记所有需要回收对象
- 清除
- 第一种:回收所有未被标记的对象(一般使用)
- 第二种:回收所有被被标记对象
缺点
:
- 效率问题(如果需要标记对象过多,效率不高甚至低)
- 空间问题(标记清除后产生大量不连续的碎片,即不连续的内存)
标记-整理算法
该算法就是解决不连续内存的算法,该对象不是针对内存回收,而是对内存进整理的,它将所有存活的对象向一端移动,然后清理对象边界以外的内存。