JVM相关知识二(垃圾回收机制)

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负载高,导致请求堆积

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值