JVM的垃圾回收机制——垃圾回收算法 - 知乎 (zhihu.com)
Java虚拟机面试题 | 小林coding (xiaolincoding.com)
GC垃圾回收(Gabage Collection)
java中的引用类型
强引用:发送GC的时候不会被回收
软引用:发送内存溢出之前会被回收
弱引用:在下一次GC的时候会被回收
虚引用:无法通过虚引用获得对象,用途是在gc时返回一个通知
判断对象是否可回收
引用计数器法
可达性分析算法:从GC Roots开始向下搜索,没有任何引用的对象是可回收的
垃圾回收算法
- 标记-清除
- 标记-复制
- 标记-整理
- 分代回收算法
分代回收算法:将内存划分成了新生代和老年代。分配的依据是根据对象的生存周期,或者说经历过的GC次数。对象创建时,一般在新生代申请内存,经历过一次GC,如果还存活,对象的年龄加1。当超过默认值时,如果对象还存活就会进入老年代
Minor GC(Young GC)
只针对年轻代,当Eden区空间不足时,jvm会触发一次,将Eden区和一个Survivor区的存活对象移动到另一个Survivor区或老年代
Major GC(Old GC)
主要针对老年代,但不一定只回收老年代
当老年代空间不足时,或者系统检测到年轻对象到老年代的速度过快,可能就会触发
Full GC
存活的对象无法全部放入老年代或者老年代空间不足以容纳存活的对象
当永久代(java 8之前的版本)或元空间(java 8 之后的版本)控件不足
GC只针对堆吗?
GC不仅会堆进行GC,还有方法区(用于存储类信息、常量、静态变量等数据)
CMS
是老年代的收集器,需要结合新生代的收集器一起使用(Serial,ParNew)
以最小停顿时间为目标
是使用标记-清楚算法,容易产生内存碎片
并发处理时,垃圾回收线程和用户线程同时工作会产生浮动垃圾
G1
收集范围是老年代和新生代,不需要结合其他收集器
可以预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
使用标记-整理算法,进行了空间整理,没有内存碎片
G1的回收是多个垃圾回收线程并行GC,不会产生浮动垃圾
浮动垃圾
并发清理阶段用户线程还在运行,这段时间就可能产生新的垃圾,新的垃圾在此次GC无法清除,只能等到下次清理。