博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA引用
阅读量:5996 次
发布时间:2019-06-20

本文共 2260 字,大约阅读时间需要 7 分钟。

正常来说,传统的JAVA引用,如
Java代码  
  1. public void doSomeThing(){     
  2.     User user = new User();     
  3.     ...     
  4. }    
public void doSomeThing(){        User user = new User();        ...    }
    当方法doSomeThing方法结束时,对象user的引用丢失,其所占的空间将由JVM在下次垃圾回收时收回.如果我们将user对象的引用保存在一个全局的HashMap中,如
Java代码  
  1. Map map = new HashMap();  
  2. public void doSomeThing(){  
  3.     User user = new User();  
  4.     map.put("user",user);  
  5. }  
Map map = new HashMap(); public void doSomeThing(){     User user = new User();     map.put("user",user); }
    此时,user对象由于在map中保存了引用,只要这个引用存在,那么JVM永远也不会收回user对象所占用的内存.
    这样的内存管理机制相信大家都耳熟能详了,在绝大多数情况下,这种解决方案都是非常完美的.但在某些情况下,却有些不便.好比如对于缓存而言,当user 对象使用之后,我们希望保留其引用以供下次需要的时候可以重复使用,但又不希望其引用一直存在,如果那样,随着时间的推移,有限的空间将会被这些数据消耗 殆尽.最好的方式莫过于一种方式,可以在对象没有被垃圾回收器回收之前依然可以访问,当垃圾回收器启动时,如果此对象没有其它对象引用,则按常规对其进行 回收.
    SoftReference,WeakReference与PhantomReference为上面的思路提供了有力支持.
    这三种类型的引用属于"非持续性引用",也就是说,这种引用关系并非持续存在,它们所代表的引用的生命周期与JVM的运行密切相关,而并非传统意义上的引用一样依赖于编码阶段的预先规划.
    SoftReference的例子:
Java代码  
  1. Java代码    
  2. SoftReference ref;     
  3. public void doSomeThing(){     
  4. User user = new User();     
  5. ref = new SoftReference(user);     
  6. }     
  7. public void doAnotherThing(){     
  8. User user = (User)ref.get();//通过SoftReference获得对象引用     
  9. System.out.println(user.getName());     
  10. }   
Java代码   SoftReference ref;    public void doSomeThing(){    User user = new User();    ref = new SoftReference(user);    }    public void doAnotherThing(){    User user = (User)ref.get();//通过SoftReference获得对象引用    System.out.println(user.getName());    }
    假设我们先执行了doSomeThing方法,产生了一个User对象,并为其创建了一个SoftReference引用.之后的某个时刻,我们调用了 doAnotherThing方法,并通过SoftReference获取User对象的引用.此时我们是否还能取得user对象的引用?这要看JVM的 运行情况.对于SoftReference而言,只有当目前内存不足的情况下,JVM在垃圾回收时才会收回其包含的引用(JVM并不是只有在内存不足的情 况下才会启动垃圾回收器,具体什么时候启动得看具体版本JVM的垃圾回收策略).这里可能出现两种情况:
    JVM目前还未出现过因内存不足所引起的垃圾回收,user对象的引用可以通过SoftReference从JVM Heap中收回.
    JVM已经因为内存不足启动了垃圾回收机制,SoftReference所包含的user对象的引用被JVM所废弃.此时ref.get方法将返回一个空 引用(null),对于上面的代码而言,也就意味着这里可能抛出一个NullPointerException.
    WeakReference比SoftReference在引用的维持性上来看更加微弱.无需等到内存不足的情况,只要JVM启动了垃圾回收机制,那么 WeakReference所对应的对象就将被JVM回收.也就是说,相对SoftReference而言,WeakReference被JVM回收的概 率更大.
    PhantomReference 比WeakReference 的引用维持性更弱.与WeakReference 和SoftReference不同,PhantomReference所引用的对象几乎无法被回收重用.它指向的对象实际上已经被JVM销毁 (finalize方法已经被执行),只是暂时还没被垃圾回收器收回而已.PhantomReference主要用于辅助对象的销毁过程,在实际应用层研 发中,几乎不会涉及.
转自:
http://edison-cool911.iteye.com/blog/1197780

转载地址:http://bpqlx.baihongyu.com/

你可能感兴趣的文章
元素化设计原理及规则v1.0
查看>>
LeetCode – Refresh – Spiral Matrix II
查看>>
sublime快捷键
查看>>
Codeforces Round#522 Div2E(思维,背包,组合数学)
查看>>
根据生日,计算年龄
查看>>
余数求和
查看>>
Kotlin入门(2)让App开发变得更容易
查看>>
C#二进制与字符串之间的相互转换
查看>>
Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)
查看>>
安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
查看>>
《怎样花两年时间去面试一个人》笔记
查看>>
网络编程bio流程Java demo
查看>>
Gym - 100269F Flight Boarding Optimization(dp+树状数组)
查看>>
Codeforces Global Round 1
查看>>
EXPORT Man Information for Linux use COMMAND col
查看>>
CodeForces 221(div 2)
查看>>
页面的注释
查看>>
UILabel居中显示的方法
查看>>
JavaScript概述
查看>>
使用线性回归推导函数实现线性回归
查看>>