先了解什么样的垃圾会被回收和哪里的垃圾

  1. 回收的是堆内垃圾
  2. 当对象没有任何引用指向,就是垃圾,就有可能被回收回去

怎么定位是需要被回收的垃圾

  1. 引用计数法:当对象被引用一次那就增加一个一个引用次数,如果未被引用过,则引用次数为0,不过可能会存在循环引用,出现内存泄露的问题

JVM学习记录三(垃圾回收器之标记法及回收算法)_内存碎片

  1. 可达性计数法:是一种默认的分析算法,利用GC Root,沿着GC ROOT为起点开始关联对象,未找到的就算是可回收的

可作为GC root的对有虚拟机栈中的引用对象、方法区中类静态属性引用的对象、方法区中常量引用对象、本地方法栈中的native方法引用的对象

JVM学习记录三(垃圾回收器之标记法及回收算法)_垃圾回收_02

垃圾回收算法

1.标记清除算法 (分为标记和清除)

1.对根据可达性分析算法分析出的垃圾进行标记

2.对标记的垃圾进行回收

优点:清除速度快

缺点:内存碎片化严重

2.复制算法

JVM学习记录三(垃圾回收器之标记法及回收算法)_内存碎片_03

内存分为两块空间,标记垃圾后将可用存活复制到另外一块内存区域

优点:在垃圾对象较多的情况下速度较快、清理后无内存碎片

缺点:内存使用户率低

3.标记整理算法

与标记清除算法比,不同点在于整理存活对象至一段,完城后才会进行清理垃圾,可以避免内存碎片问题,性能也较低,很多老年代都会使用这个算法

JVM中的分代回收:

minorGC:指的是发生在新生代的垃圾回收,会有短暂的STW

MixGC:新生代和老年代部分区域的垃圾回收,使用的G1收集齐

full GC:新生代+老年代的全部区域的垃圾回收,暂停时间长