java JVM 垃圾回收(GC)

关于垃圾回收 大多数会有三个问题:GC是什么时候,对什么东西,做了什么事情

什么时候:

垃圾收集器在堆进行回收前,第一件事就是要确定这些对象是否还活着,常用算法:引用计数算法,可达性分析算法。大多数情况对象在新生代Eden区中分配,当eden 满了虚拟机发起minor gc。大对象直接进入老年代,所谓的大对象就是那种很长的字符串及数组。升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过 MaxTenuringThreshold控制进入老年前生存次数等。

对什么东西:

从GC root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。也就是死了的对象

做了什么事情:

新生代
1新生代采用的是复制算法做的是复制清理,绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快;

2.当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的);

3.此后,每次Eden区满了,就执行一次Minor GC,并将剩余的对象都添加到Survivor0;

4.当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1(此时,Survivor0是空白的)。
5.当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代)之后,仍然存活的对象(其实只有一小部分,比如,我们自己定义的对象),将被复制到老年代。
老年代
老年代采用的是标记整理法做的标记清理。顾名思义就是将标记的存活对象都像一端移动,然后直接清理掉端边界以外的内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值