JVM分代垃圾回收机制(年轻代、年老代、永久代)

今天在学习垃圾回收机制的时候老师引用了一个很形象的例子来理解分代机制,所以我想跟大家分享一下,让我们来一起看看吧。

首先我们需要明白分代垃圾回收机制是基于这样一个事实:不同的对象的生命周期是不一样的。因此不同生命周期的对象可以采用不同的回收算法,以便于提高回收效率。在此我们将对象分为三种状态:年轻代、年老代、永久代。同时将处于不同状态的对象放到堆中的不同区域。JVM将堆内存分为Eden、Survivor和Tenured/Old空间,其中Eden和Survivor属于年轻代,Tenured/Old属于年老代。有朋友可能会有疑问,永久代哪去了呢,别着急,我们最后在解释永久代的问题.

接下来就让我们先来看看这个例子吧。我们可以把整个堆内存当成一个饭店,里面有包间、大厅(Tenured)还有盒饭区域(Eden和Survivor)。盒饭区域就是来了赶紧吃,吃完赶紧走人,人员流动性比较大;大厅的话相对来说流动性没有那么大,你可以喝点小酒慢慢吃;而包间时间就更长了,你可以和几个朋友吃饭喝酒聊天,直到饭店打烊再走也没关系。

所有新来的顾客(所有新生成的对象)都会先被安排在盒饭区的Eden区,直到Eden区满了以后就需要我们的小服务员(Minor GC)上场了,我们的小服务员不需要太多资源,随叫随到,她会把Eden区全部的对象都回收,如果是吃完了的顾客(无用的对象)会被清除,那些没有吃完的顾客(还在使用的对象)会被放到Survivor1区,然后Eden区会存入新的对象,如此往复,无用的清除,有用的放入S1区。直到S1区满了以后,小服务员会再看一看S1区谁吃完了,谁没吃完,吃完了的会被清除,没有吃完的会被请到S2区接着吃,把S1区清空。
在这里插入图片描述
但是,S2区也会有满的时候。当S2区满了以后,小服务员会把那些还没有吃完的顾客再次放入S1区。如此往复,当S1区与S2区交替15次后,如果还存在没有吃完的顾客(有用的对象)的话,此时小服务员就会把他们放入大厅区域(此时对象就进入了年老代)。
在这里插入图片描述
当对象进入年老代之后,他的回收机制就不归小服务员管了,此时就该大服务员Major GC和Full GC登场了,而大服务员的启动相对小服务员来说就没有那么快了,耗费的资源也多,所以是直到大厅都满了以后才会启动大服务员。可能会有朋友疑问,Major GC和Full GC有什么区别呢?Major GC和Full GC的区别就在于Major GC只清理大厅的顾客,而Full GC则会来一次大扫除,她会把大厅和盒饭区域全部都给清理了。

当然还有一些顾客,不管什么时候来,直到晚上饭店打烊才走,这样的顾客就会把他放入包间,也就是说JVM一开就存在的对象,直到JVM关掉才释放,就会被存入永久代。永久代里存放的一般是静态文件,比如Java类、方法、常量等,他对垃圾回收没有显著影响。JDK7以前永久代就是方法区的一种实现,而在JDK8及以后就把永久代给舍弃了,转而用metaspace元数据空间和堆替代。
在这里插入图片描述

总结
Minor GC:用于清理年轻代区域,当Eden区满了之后就会触发一次Minor GC,清理无用的对象,将有用的对象复制到S1和S2区中。
Major GC:用于清理年老代区域。
Full GC:用于清理年轻代和年老代区域,成本较高,会对系统性能产生影响。

如果有不对的地方望各位大佬指正,如果觉得有用的话,希望各位大佬点点关注,感谢

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值