1 作用
垃圾回收机制是JVM中帮助程序员管理内存的一种辅助机制,它会自动回收内存,释放内存空间,防止内存泄露。
2 算法
标记通常采用可达性分析法进行,该算法的思路是从根对象集合(GCRoots)开始,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达。
1 标记—清除法
遍历一次,标记出所有未被使用的对象,在遍历一次,清除所有被标记的对象。
优点:无需额外内存空间。
缺点:遍历两次,所需时间更长。
2 标记—整理法
与 1 类似,但是清除时会将所有未被标记的对象移动到内存空间的同一端,以增加连续空间。
优点:减少碎片空间。
缺点:需要更多的时间和空间进行移动操作。
3 复制法
遍历一次,在查询到正在使用的对象时,将该对象复制到其它内存区域,在遍历结束后,将原内存区域全部清空。
优点:遍历一次,效率更高
缺点:需要额外空间保存复制的对象
3 垃圾收集器(待进一步学习)
1 serial
默认的垃圾回收器,适用于单核机器,在进行垃圾回收时,会停止用户线程STW,年轻代采用了复制算法,老年代采用标记—整理算法。
2 parallel
serial的多线程版本,提高了垃圾回收的效率,运行逻辑基本与serial一致。
3 CMS(待进一步学习)
CMS注重响应时间,通过增量更新和并发标记的方式进行垃圾回收,主要目的是减少垃圾回收对用户线程的暂停时间。
4 G1(待进一步学习)
是一种堆内存分区的垃圾回收器,将堆内存分为多个独立的子区域,可以并行、并发地进行垃圾回收。它使用了SATB(snapshot-at-the-beginning)算法,能够快速地定位对象引用关系,提高垃圾回收效率。
4 GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式
Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式
1 minor GC(young GC)
针对新生代的垃圾回收机制,因为年轻代中对象大多数都是短暂存在,都要进行回收,而新生代的空间通常也较大,因此minor GC通常采用复制算法。
触发条件:
1 在Eden区满时,survivor区满时并不会触发。
2 在Eden区没有连续空间存储大对象时。
2 full GC
针对整个堆空间的垃圾回收机制,在老年代中的对象大多数都是长期存在的,因此通常采用标记—整理算法进行垃圾回收。
触发条件:
1、老年区满时
2、空间担保失败
3、调用System.gc()方法
4、并发模式失败(CMS在执行回收操作时,新生代发生垃圾回收,同时老年代没有足够的空间来容纳晋升的对象,此时CMS垃圾回收会退化为单线程的Full GC)
5、JDK1.7以前,永久代空间不足
3 频繁触发full GC的可能
1、并发量过高或者同时处理过多数据,导致GC后存活对象的数量过多,动态年龄判断机制会根据年龄从小到大累计对象大小,当超过了survivor区的50%(可配置),年龄大于或者等于该批对象最大年龄的对象,将会直接进入老年区,而老年区空间也不足时,就会触发full GC。
2、在minor GC前,会先判断对象大小,若对象的大小超过了survivor区可用连续空间,此时对象将会直接进入老年区,若老年区空间不足,也就是空间担保失败,就会触发full GC。
3、错误使用system.gc()。
4、内存泄露,对象无法及时回收。
5、系统处理请求过慢或者无法处理请求,导致请求堆积。
6、JDK1.7以前,方法区加载过多方法导致空间不足
7、CPU负载高,导致请求堆积