JVM——垃圾回收(GC)

GC简介

java语言运行在java虚拟机(jvm)上,为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力,可以有效的清除不用的对象,使空间的利用更加合理。下面介绍该机制的原理。

判断对象已废弃

  • 引用计数法
    给每一个对象都配备一个计数器,对于该对象,若增加一个指向它的引用,则计数器加1;每失效一个引用,则计数器减一。
    但是,如果两个对象互相引用,但都对于外部都已失去用途,则这样的两个对象是无法被计数为0的,因为他们的计数器永远都只为1。
  • 可达性分析法
    为了解决引用计数法的缺陷,我们引入可达性分析。
    从引用链的顶端root开始,只要在这条引用链上的对象都是有用的,因此不应该被回收。而对于剩下的对象,一定是不可到达的对象,也就没什么意义了。

如何释放无用的对象空间

  • 标记清除
    将废弃的对象空间标记出来,直接清除即可。
    但是,这样会造成空间的碎片过多。如果有较大的对象需要空间,则会有更大的可能,它无法找到这样的空间。

  • 复制法
    将堆空间分为两块,不妨叫做from和to。每次new对象的时候,先放在from上,(to块保持空闲),直到from区域放满,这是要进行垃圾回收,将存活的对象复制到 to上,然后清空from区域,并将from和to进行互换,重新开始。
    缺点是,总有一部分空间要充当to区域,因此该区域总是空闲着等待交换。造成内存的浪费。

  • 标记整理
    类似于标记清楚,只不过是在标记之后不是简单的清除,而是将存货对象整理好,一个一个排在一起。让后释放剩下的连续的一整块空间。这样做的坏处是,需要对所有对象进行复制移动,比较耗时。

  • 分代处理
    将堆内存区分为Eden区,survivorFrom区、surviorTo区(以上三个都属于年轻代),老年代和永久代。

    1. 当新建对象的时候一般是首先放在年轻代的Eden和surviorFrom中,当满了之后,将存活对象放入survivorTo中(及MinorGC),放不下的直接放入年老代;互换survivor的from和to区。
    2. 当老年代也满了之后,将执行一整个的大清洗FullGC,将所有堆内存(除了永久代)进行一次完整的GC。
    3. 永久代是不会在主程序运行期间进行GC的。永久代主要存放Class类信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值