JVM四种对象引用类型

JVM 中将对象的引用分为了四种类型,不同的对象引用类型会造成GC 采用不同的方法进行回收:


1.强引用
默认情况下,对象采用的均为强引用,例如:


A a=null;
public void execute(){
a=new A();,
// 其他代码
}


只有当execute 所在的这个对象的实例没有其他对象引用,GC 时才会被回收。


2.软引用(Soft Reference)
软引用是Java 中提供的一种比较适合于缓存场景的应用,采用软引用修改之上的代码
如下:
SoftReference aRef=null;
A a=null;
public void execute(){
if((aRef==null)||(aRef.get()==null)){
a=new A();
aRef=new SoftReference(a);
}
else{
a=aRef.get();
}
// 执行代码
a=null;
}
代码中不同于强引用中的为在execute 方法的最后将a 设置为了null,当execute 方法执
行完毕后,a 对象只有在内存不够用的情况下才会被GC,这对于合理的使用缓存而言无疑
非常有作用,既可以保证不至于大量使用缓存出现OutOfMemory,又可以在内存够用的情
况下提升性能。


3.弱引用(WeakReference)
采用弱引用修改之上的代码如下:


WeakReference aRef=null;
A a=null;
public void execute(){
if((aRef==null)||(aRef.get()==null)){
a=new A();
aRef=new WeakReference(a);
}
else{
a=aRef.get();
}
// 执行代码
a=null;
}
对于a 这个引用,在GC 时a 一定会被GC 回收,这种引用有助于GC 更快的回收对象,
尤其是位于集合中的对象,同时也有助于在GC 未回收之前仍然调用此对象来执行一些动作。


4.虚引用(PhantomReference)


采用虚引用修改之上的代码如下:


ReferenceQueue aRefQueue=new ReferenceQueue();
PhantomReference aRef=null;
A a=null;
public void execute(){
a=new A();
aRef=new PhantomReference(a,aRefQueue);
// 执行代码
a=null;
}


在SoftReference 和WeakReference 中也可以放入ReferenceQueue,这个Queue 是用于
对象在被GC 后用于保存Reference 对象实例的,由于虚引用只是用来得知对象是否被GC,
通过PhantomReference.get 返回的永远是null,因此它要求必须有ReferenceQueue,当上面
代码中的a 对象被GC 后,通过aRefQueue.poll 可以获取到aRef 对象实例,从而可以做一些
需要的动作。

 

"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

  虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合 使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解

  被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值