对象引用及垃圾收集算法

垃圾收集

当java实例对象使用过后,垃圾收集器会首先判断该对象是否还“存活”着,若不是,将被垃圾收集器所清理。

1.判断一个对象实例是否“已死”

其主要有两种算法:

引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;
当引用失效时,计数器值减1;任何时刻计数器为0的对象就是不可用的对象,被回收。
但java虚拟机并不是通过引用计数算法来判断对象是否存活。

根搜索算法

通过一系列名为“GC Roots”的对象作为起点,向下搜索,搜索经过的路径为“引用链”,当一个对象没有任何引用链相连,证明该对象失效。

如图obj5,obj6,obj7与GC Roots不可达,故失效:
根搜索算法

在java中,可以作为GC Roots 的对象包括以下4种:

1.虚拟机栈中的引用对象。
2.方法区中的类静态属性的对象。
3.方法区中的常量引用的对象。
4.Native引用的对象。

2.垃圾收集算法

1.标记-清理算法:直接标记后,清理,容易产生碎片。

2.复制算法:将内存分为两块,已使用与未使用的两块; 垃圾清理前将未失效的复制到位使用的一边,然后使用为使用的的一块,清理已使用的一块。浪费空间,还需要额外的空间进行担保。

3.标记-整理算法:与标记清理算法一样,后续步骤让所有未失效的对象都向一端移动,然后直接清理掉边界以外的内存。

4.分代收集算法:Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

(1)对新生代的对象的收集称为minor GC; (2)对旧生代的对象的收集称为Full GC;
(3)程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收

3.引用分类

(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)
(3)弱引用:在GC时一定会被GC回收
(4)虚引用:由于虚引用只是用来得知对象是否被GC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值