Java引用了解正常来说,传统的JAVA引用,如 Java代码SoftReference refpublic void doSomeThing(){User use
Java引用了解
正常来说,传统的JAVA引用,如
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主要用于辅助对象的销毁过程,在实际应用层研发中,几乎不会涉及.