关闭

JAVA的四种引用类型

标签: 强引用软引用弱引用虚引用
5852人阅读 评论(0) 收藏 举报
分类:
Java四种引用类型

1.引用的基本概念
强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。

软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象。

弱引用: 如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收。弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。

虚引用:如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。

上面的四种引用对应的是new关键字以及java.lang.ref包中的SoftReference,WeakReference, PhantomReference。我们注意到在java.lang.ref包中,还存在一个类叫做ReferenceQueue。

2.理解ReferenceQueue
当软引用对象被GC之后,虽然这个SoftReference对象指向的对象已不存在,但这个SoftReference对象本身还占用内存,因此需要一个适当的清除机制,避免大量SoftReference对象带来的OOM。这就需要用到ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如下例子:

ReferenceQueue queue = new ReferenceQueue();
SoftReference ref=new SoftReference(new MyObject(), queue);


那么当这个SoftReference指向的MyOhject对象被垃圾收集器回收的同时,ref对象本身会被放入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,但这些Reference对象引用的对象已经不存在了。

我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强引用对象被回收。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回收。于是我们可以把这些失去软引用的对象的清除掉。


3.理解WeakHashMap
WeakHashMap是以弱引用为键实现的HsahMap。更精确地说,对于一个给定的key对象,其对应的value对象的存在并不能阻止该key对象被GC。GC某个key对象时,它所在的条目会一并被从Map中删除。这是WeakHashMap与其他HashMap最大的不同。看下面的例子:
import java.util.Iterator;
import java.util.WeakHashMap;

public class Demo{
    public static void main(String [] args) throws Exception{
        WeakHashMap<String,String> weakHashMap=new WeakHashMap<String, String>();
        String [] sts=new String[10];
        for(int i=0;i<100;i++){
            if(i%10==0) {
                sts[i/10]=new String(""+i);
                weakHashMap.put(sts[i/10], new String(""+i));
            }
            else
                weakHashMap.put(new String(""+i), new String(""+i));
        }

        // 催促垃圾回收器工作  
        System.gc();
        // 把CPU让给垃圾回收器线程  
        Thread.sleep(8000);

        Iterator<String> iterator=weakHashMap.keySet().iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}  











   
0
0
查看评论

Java中的四种引用类型 Strong, Soft, Weak And Phantom

前言总所周知, java不同于c/c++,它不需要程序员自已来管理内存(分配,释放内存),java 会自己来管理内存,比如销毁某些不再被使用的对象。这些操作都是在一个后台线程默默进行(Garbage Collector Thread),也就是垃圾收集器线程,根据jvm实现的策略来释放对象内存。但是程...
  • rodbate
  • rodbate
  • 2017-06-04 14:18
  • 662

Java对象的四种引用类型

参考博客:http://my.oschina.net/Bruce370/blog/511707在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种...
  • gs12software
  • gs12software
  • 2016-04-03 20:18
  • 5584

Java四种引用类型

Java从1.2版本开始引入了4种引用,这四种引用的级别由高到低依次为:强引用>软引用>弱引用>虚引用。 一、强引用(StrongReference):         强引用是使用最普遍的引用,一般我们将对象初始化之后就是一个强引用。当...
  • qq924862077
  • qq924862077
  • 2015-08-26 00:12
  • 1040

深入理解Java的4种引用类型

首先大家应该都知道Java从1.2起提供了四种引用类型,他们分别是其引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被GC回收的可能性从大到小排列。如下图可以看到Reference是...
  • renpingqing
  • renpingqing
  • 2016-05-06 15:57
  • 4904

java中四种引用类型(对象的强、软、弱和虚引用)

对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依...
  • u011936381
  • u011936381
  • 2013-09-15 16:11
  • 5099

内存优化-java四种引用,让你能更好的构建你的项目

前言: Activity和fragment都有生命周期,那对于我们的java对象而言同样是有生命周期的,比较笼统的说,那就是当他被创建的时候一直到GC回收终止,这样一个对象的生命周期就走完了。而java为我们提供了4种引用类型,分别是 1.强引用-StrongReference 2.弱引用-W...
  • qq_27540131
  • qq_27540131
  • 2017-06-12 03:00
  • 251

四种类型的引用

从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。
  • u010066934
  • u010066934
  • 2016-08-06 15:13
  • 483

java的四种引用,强弱软虚,用到的场景

1、强引用(StrongReference)           强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: ?       &#...
  • heminghung
  • heminghung
  • 2016-05-11 22:59
  • 5449

Java的四种引用,强弱软虚,用到的场景

http://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/ java中的4种reference的差别和使用场景(含理论.代码和执行结果) 我们知道java语言提供了4种引用类型:强引用、...
  • u011860731
  • u011860731
  • 2015-09-24 17:51
  • 11963

java的四种引用类型

java的引用分为四个等级:4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序...
  • xiangzhihong8
  • xiangzhihong8
  • 2014-12-29 14:53
  • 616
    个人资料
    • 访问:150908次
    • 积分:1774
    • 等级:
    • 排名:千里之外
    • 原创:138篇
    • 转载:11篇
    • 译文:0篇
    • 评论:39条
    最新评论