4中引用(强,软,弱,虚)侧重弱引用

1,强引用,对象有强引用与之关联,即使在内存不足,抛出OutOfMemory错误也不会回收这种对象

2,软引用是用来描述一些有用但并不是必需的对象,java.lang.ref.SoftReference类来表示。
   对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。可以很好地用来解决OOM的问题,适合用来实现缓存:比如网页缓存、图片缓存等。
   软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

3,弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。  在java中,用java.lang.ref.WeakReference类来表示。
  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,就会被加入到与之关联的引用队列中。

4,虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。
   如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
   注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。

弱引用和虚引用的区别是:虚引用总是存在的,只是看存在地方的。而若引用如果没有队列与关联,那么垃圾回收就会没了。如何有关联队列那么两者就一样了。

说说WeakReference弱引用

Java弱引用(WeakReference)的理解与使用

侧重说下弱引用:因为ThreadLocal用到了弱引用,而线程局部变量被广泛的应用在各种框架中。

了解如何定义和使用:

public class Car
{
    private double     price;
    private String    color;

    public Car(double price, String color)
    {
        this.price = price;
        this.color = color;
    }
public class WeakReferenceCar extends WeakReference<Car>
{
    public WeakReferenceCar(Car car)
    {
        super(car);
    }
}
Car car = new Car(2000.0, "red");
WeakReferenceCar wrc = new WeakReferenceCar(car);

当gc执行:WeakReferenceCar关联的对象Car被回收掉了。

值得注意的是car本身是有强引用的(xxx=new xxx()):

public static void main(String[] args) {

        Car car = new Car(22000,"silver");
        WeakReference<Car> weakCar = new WeakReference<Car>(car);
        int i=0;
        while(true){
            if(weakCar.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakCar);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }

即使有 car 引用指向对象, 且 car 是一个strong reference, weakCar指向的对象仍然被回收了.

这是因为java的编译器在发现进入while循环之后, car 已经没有被使用了。

而如果后面有使用是不会被回收的比如下面:

        Car car = new Car(22000,"silver");
        WeakReference<Car> weakCar = new WeakReference<Car>(car);
        int i=0;
        while(true){
            System.out.println("here is the strong reference ‘car‘ "+car);
            if(weakCar.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakCar);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }

总结:

1,一个变量(该变量是局部变量)是否被回收,看方法是否执行完,一般都被回收的。
   但是如果赋值给了其他全局变量,那么是不会被回收的。

2,是否是强引用,一般是不会被回收,但是如果后面没有使用,也是会被回收的。

3,是否是弱引用,一般gc执行就会被回收,   但是如果有强引用关联,那么是不会被回收的,
   但是出现第2点的情况,也就是后面不被使用了,也是会被回收的  (其实有强引用关联也就当作强引用的情况在处理了)

补充:对于强引用是否需要手动置空?以便让gc回收。

Object c = new Car();
c=null;

其实是不需要的,手动置空对象对于程序员来说, 是一件繁琐且违背自动回收的理念的.

因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被从stack中popup, 所以他就能在下一次GC执行时被回收了

最后一个问题:缓存用哪个引用?

很多人觉得用软引用更好,内存不够再回收。

个人觉得不可以:

据说内存不够时候,清理过程中程序会被挂起,这样很不友好。

而一般启动清理机制,应该是内存使用到达一定程度(应该是可以设置的),运行中的程序还是可以继续执行。

原文地址:https://www.cnblogs.com/straybirds/p/8314115.html

时间: 2024-08-24 22:37:37

4中引用(强,软,弱,虚)侧重弱引用的相关文章

Java中的四种引用类型,强引用,软引用,弱引用,虚引用

对于Java中的垃圾回收机制来说,对象是否被回收的标准在于该对象是否被引用.因此,引用也是JVM进行内存管理的一个重要概念. Java中对象的引用一般有以下4种类型: 1强引用  2软引用  3弱引用  4虚引用 以下一一介绍其用法和区别 1强引用:在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收.因此强引用是造成Java内存泄漏的主

Java中的强引用、软引用、弱引用和虚引用

本文为阅读下面四篇博文的读书笔记 http://sishuok.com/forum/blogPost/list/342.html http://blog.sae.sina.com.cn/archives/5228?utm_source=tuicool http://www.cnblogs.com/dolphin0520/p/3784171.html http://blog.csdn.net/arui319/article/details/8489451 四种引用的前世今生 Java 在设计之初就

Java中的四种引用(强引用、软引用、弱引用、虚引用)

以下内容摘自<深入理解Java虚拟机 JVM高级特性与最佳实践>第2版,强烈推荐没有看过的同学阅读,读完的感觉就是"原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴" 在JDK1.2以前,Java中的引用的定义很传统:如果 reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,对于如何描述一些"食之无味,弃之可惜"的对象就显得

java对象的强引用,软引用,弱引用和虚引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题.一般都是new出来的. Object o=new

Java 强引用、 软引用、 弱引用、虚引用

 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.下图为对象应用类层次. ⑴强引用(StrongReference)   强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内

[转]Java 的强引用、弱引用、软引用、虚引用

1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不

弱引用、软引用、虚引用以及强引用

如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式.相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象.弱引用和软引用的特殊行为使得它们在某些情况下非常有用.例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象.而弱引用非常适合存储元数据,例如:存储ClassLoader引用.如果没有类被加载,那么也没有指向ClassLoader的引用.一旦上一次的强引用被去除,只有弱引用的ClassLoader就

强引用、软引用、弱引用、虚引用详解

强引用.软引用.弱引用.虚引用详解 先说一下垃圾回收机制GabageCollection: GC是垃圾收集的意思(GabageCollection).和JAVA一样,ANDROID系统也是由GC来自动回收内存的.android中一个应用的启动,android系统都会为这个应用分配一个dalivk虚拟机,以便这个应用运行在这个独立的虚拟机上,可是一个虚拟机内存大小一般也是限制的(20M左右).可见,一个应用的运行所申请的内存不可能无限大的. 通常,GC是在一个单独的比较低优先 级线程中运行.这样其

【转】JAVA四种引用(强引用,弱引用,软引用,虚引用)

转自:http://www.cnblogs.com/gudi/p/6403953.html 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮