GC(一)

线程私有区域伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除;而Java堆和方法区这两个区域是线程共享的,这部分内存的分配和回收是动态的;所以GC关注的是这部分的内存如何管理

JVM在进行GC的时候,并不是对三个区域统一回收。大部分的时候,回收都是在新生代

新生代
幸存区(from/to)
老年区

GC两种类:轻GC(普通GC)、重GC(全局GC)

GC题目
1.JVM内存模型和分区~详细到每个区放什么?
2.堆里面的分区有哪些?Eden、from、to、老年区,说说他们的特点?
3.GC算法有哪些?标记清楚法、标记压缩、复制算法、引用计数器(效率太低)怎么用的?
3.轻GC和重GC分别在什么时候发生?

引用计数法
每个对象都要有一个计数器,计数器本身也会有消耗,对象c为零,就把对象c移除(效率低下)
在这里插入图片描述
复制算法:
from\to区是会相互转变的,to区域永远为空
比如:

把Eden区的垃圾对象清除,没有清除的垃圾对象复制到to区域,from中的垃圾对象复制到to区域。此时to区域变成from区域,from区域变成to区域,保证to区域为空。经过15次轻GC之后,还没有被清楚的垃圾对象进入养老区
在这里插入图片描述
注意:
1.每次GC都会将Eden活的对象移到幸存区中,一旦Eden区被GC后,都会是空的
2.谁空谁是to
3.当一个对象经历了十五次GC还没有被清楚,就会进入到养老区,进行重GC(通过-XX: -XX:MaxTenuringThreshold=参数,通过这个参数可以设定进入老年区的时间
新生代主要用的就是复制算法

好处:没有内存碎片~
坏处:浪费了内存空间~多了一半空间永远是to

使用场景:对象存活度较低:新生区~

标记清除:
1.扫描这些对象,对活着的对象进行标记
2.对没有标记的对象进行清除
在这里插入图片描述

优点:不需要额外的空间
缺点:两次扫描,严重浪费时间,会产生内存碎片

标记压缩清除:
再优化:防止内存碎片
多了一个扫描,增加移动成本
在这里插入图片描述
可以先标记清除几次之后,再来一次压缩

总结:
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法

GC:分代收集算法
年轻代
存活率低 ------复制算法
老年代
区域大,存活率高
标记清除(内存碎片不是太多)+标记压缩混合实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值