JVM(四) 垃圾回收算法

什么是垃圾回收算法

1.垃圾回收算法,是JVM在执行回收垃圾的时候,根据不同的算法,来使用不同的方式来回收

常见的回收算法

1.复制算法

复制算法是在新生代开辟两块内存,在要回收的垃圾上,标记一下,发生GC的时候将垃圾清除了,然后由于不同的垃圾在不同的地方,导致内存排序的不规则和不放开插入新的内存对象,所以我们会拷贝对象到另一面内存里面去,去整理对象,这样就会消耗一面内存,

缺点:就是会闲置一面内存

2.标记清除算法(老年代垃圾回收算法)

标记清除算法,就是将需要,该回收的对象打一个标记,在进行GC的时候JVM查看改对象是否被引用和该对象是否可达,如果都不行那么,该对象会被回收掉

缺点:该算法的缺点是,会造成内存碎片

3.标记整理算法(老年代垃圾回收算法)

标记清除算法,就是将需要,该回收的对象打一个标记,在进行GC的时候JVM查看改对象是否被引用和该对象是否可达,如果都不行那么,该对象会被回收掉

缺点:解决了标记清除算法的 内存碎片问题

Eden和Survivor区的作用

Eden和两个Survivor默认比例是 8:1:1,这样的话,如果年轻代分配了1G内存,那么只会浪费100M的内存,内存的创建会在Eden里面,如果满了,那么会发生GC,Eden会把对象和Survivor的对象放置到另一个Survivor里面去,这样就只会限制一个Survivor了

4.触发YongGC的条件

1.新生代的Eden满了,会发生YongGC然后将Eden里面的垃圾回收,然后剩下的转移到Survivor里面,

5.触发YongGC会去检查老年代大小,涉及哪几个条件和步骤

1.在触发YongGC前期会去检查老年代大小,如果老年代大小,小于新生代所有对象大小,即YongGC后所有对象都是存活的,而且Survivor也放不下,也可以转移到老年代,但是老年代的空间太小放不下,就回去判断HandlePromotionFailture这个参数是否设置

1.如果设置了,就继续往下判断,老年代当前剩余内存大小是否大于,平均每次进入老年代的内存大小

2.如果没有设置,那么执行Full GC,但是Full GC通常是年轻代GC时间的十倍,有程序暂停的风险

3.如果设置了,就指向YongGC,但是有三种情况

3.1 发生GC后剩余对象大小,小于survivor内存大小,然后符合条件的对象直接进入老年代

3.2 发生GC后剩余对象大小,小于老年代的剩余内存,进入老年代的对象,那么直接进入老年代

3.3 如果发生GC后剩余内存大小,大于survivor内存大小,也大于老年代内存大小,那么直接执行fullGC

6.那些条件下YongGC对象会直接进入老年代

1.对象足够大,超过我们配置的大小

2.超过默认年龄15岁

3.survivor区域不能存放这一次YongGC的年轻代对象了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值