Java垃圾收集器和内存分配策略

一、对象存活问题


1.1 引用计数法
给每一个对象添加一个引用计数器,每当有一个地方引用它时,引用计数器就会+1,;引用失效时,引用计数器会-1,当引用计数器为0时,表示该对象不可用了。


1.2 可达性分析算法
这里写图片描述
如图所示,当一个对象到GC Roots没有任何的到达途径,就像Object5、Object6和Object7一样,则表示这个对象是不可用的。


1.3 引用
引用可分为强引用、软引用、弱引用和虚引用4种,引用强度依次减弱。
1、强引用:类似Object obj = new Object();都可称为强引用,只要这种引用还是存在的,就不会回收掉它。
2、软引用:SoftReference类实现软引用,软引用关联的对象会在系统将要发生内存溢出异常之前进行回收。
3、弱引用,WeakReference类实现弱引用,弱引用关联的对象会在下次垃圾回收的时候被回收。
4、虚引用,PhantomReference类实现虚引用,虚引用不会影响对象的生存时间,其目的是为了在被回收时收到一个系统通知。

1.4 finalize()方法(被回收前最后的救赎)
当对象不可达时,该对象会在回收前进行一次最后的救赎finalize。对象被判定要执行finalize时,该对象会被放入一个队列中等待执行,系统中有一个低优先级的finalizer执行这个finalize。若finalize中包含有该对象重新建立引用的情况,且finalize第一次被调用,则该对象自救成功,否则依然有很大的可能在稍后被回收。finalize不推荐使用,代价高昂,不确定性大。


二、HotSpot的算法实现

2.1 枚举根节点
以从GC Roots出发,找引用链为例,我们需要遍历整个应用的引用就会浪费太多时间。另外查找引用时,需要GC 停顿,因为不允许查找引用的时候,其引用的状态还会在这个查找的时间段内改变,这样的话就必须将整个程序停下。
HotSpot在系统停顿下来后,并不需要一个不漏的检查完所有的引用位置,它使用OopMap的数据结构直接得知哪些地方存放着对象引用。

2.2 安全点和安全区域
系统不可能在每一条指令处都生成Oop指令,因为这样会产生大量额外的内存消耗。只会在安全点处生成Oop指令,安全点一般选取的是那些能够长时间执行的指令处。安全区域则是扩大了的安全点,一段引用关系不改变的区域。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值