一,定义

在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用(StrongReference)、软引用(SoftReference)弱引用、(WeakReference)、虚引用(PhantomReference)。这四种引用的强度关系:强引用>软引用>弱引用>虚引用。

1,强引用:这种引用就是我们在代码中最常用的,类似于“Object o = new Object()”,这个“o”引用就是强引用,只要强引用还存在,GC永远不会回收掉被引用的对象。 
2,软引用:软引用是用来描述那些有用但非必须的对象,在系统发生内存溢出之前会对这些对象进行回收,也就是说内存不足就会回收这些对象,如果内存足够,即使手动GC也不会回收被软件引用指向的对象。 
3,弱引用:弱引用用来描述非必须对象,强度比软引用更弱,当GC工作时,不管当前内存是否足够,都会回收只被弱引用指向的对象。 
4,虚引用:与其他几种引用不同,虚引用不会影响对象的生存时间,也不能通过虚引用来获得一个对象的实例,它唯一的目的就是对象被回收时能收到一个通知。

二,实例说明

说了几种引用的概念,我们结合一些实例来说明他们各自的特性。

public class MyClass {public static void main(String[] agrs){MyClass myClass = new MyClass(20,"Zhang san");SoftReference<MyClass> softReference = new SoftReference<MyClass>(new MyClass(15,"Li si"));WeakReference<MyClass> weakReference = new WeakReference<MyClass>(new MyClass(10,"Wang er"));PhantomReference<MyClass> phantomReference = new PhantomReference<>(new MyClass(5,"Ma zi"), new ReferenceQueue<>());System.out.println("strong reference myClass = " + myClass);System.out.println("soft reference get: " + softReference.get());System.out.println("weak reference get: " + weakReference.get());System.out.println("phantom reference get: " + phantomReference.get());}private int age;private String name;public MyClass(int age, String name){this.age = age;this.name = name;}@Overridepublic String toString() {return "name[" + this.name + "] age[" + this.age + "]";}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method executed...." + this);}
}

我们先看上面的例子,一个测试类,main()方法中定义了四个变量,分别是强引用、软引用、弱引用、虚引用,我们看下运行后的打印信息

strong reference myClass = name[Zhang san] age[20]
soft reference get: name[Li si] age[15]
weak reference get: name[Zhang san] age[20]
phantom reference get: null

从打印信息我们可以得知,虚引用虽然指向了一个对象,但是通过该引用得到的对象是null,这就验证了前面我们说的,不能通过虚引用得到对象的实例。 
接下来,我们做点修改,加上显示调用垃圾回收,主要修改如下:

public static void main(String[] agrs){MyClass myClass = new MyClass(20,"Zhang san");SoftReference<MyClass> softReference = new SoftReference<MyClass>(new MyClass(15,"Li si"));WeakReference<MyClass> weakReference = new WeakReference<MyClass>(new MyClass(10,"Wang er"));PhantomReference<MyClass> phantomReference = new PhantomReference<>(new MyClass(5,"Ma zi"), new ReferenceQueue<>());System.gc();System.out.println("strong reference myClass = " + myClass);System.out.println("soft reference get: " + softReference.get());System.out.println("weak reference get: " + weakReference.get());System.out.println("phantom reference get: " + phantomReference.get());}

运行结果如下:

strong reference myClass = name[Zhang san] age[20]
finalize method executed....name[Ma zi] age[5]
finalize method executed....name[Wang er] age[10]
soft reference get: name[Li si] age[15]
weak reference get: null
phantom reference get: null

从结果中我们可以看到,当显示调用垃圾回收时,弱引用和虚引用对象都被回收了,这说明弱引用和虚引用指向的对象在发生GC时一定会被回收。但强引用和软引用指向的对象并没有被回收。我们接着做些修改,修改如下:

public static void main(String[] agrs){MyClass myClass = new MyClass(20,"Zhang san");SoftReference<MyClass> softReference = new SoftReference<MyClass>(new MyClass(15,"Li si"));WeakReference<MyClass> weakReference = new WeakReference<MyClass>(new MyClass(10,"Wang er"));PhantomReference<MyClass> phantomReference = new PhantomReference<>(new MyClass(5,"Ma zi"), new ReferenceQueue<>());myClass = null;System.gc();System.out.println("strong reference myClass = " + myClass);System.out.println("soft reference get: " + softReference.get());System.out.println("weak reference get: " + weakReference.get());System.out.println("phantom reference get: " + phantomReference.get());}

同样看下运行的结果

strong reference myClass = null
finalize method executed....name[Zhang san] age[20]
finalize method executed....name[Ma zi] age[5]
finalize method executed....name[Wang er] age[10]
soft reference get: name[Li si] age[15]
weak reference get: null
phantom reference get: null

可以看出这个时候,强引用指向的对象被回收了,这是因为我们把myClass引用置空了,也就是说name为张三,age为20的对象没被引用了,当发生GC的时候,该对象就会被回收。

三,总结

强引用指向的对象如果被引用,发生GC时是不会被回收的,除非该对象没有被引用;软引用指向的对象在发生GC时不一定会被回收,该对象会被回收的条件是内存不足;弱引用和虚引用指向的对象在发生GC时一定会被回收,此外通过虚引用得不到引用的对象实例。

Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference相关推荐

  1. 【java.lang.ref】SoftReference WeakReference

    目录 零.前情概要 ref包内容 系列目录 上一章回顾 一.WeakReference 适用场景 测试案例 应用举例 二.SoftReference的适用场景 三.量化软引用"内存紧张&qu ...

  2. Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践

    最近在看netty的时候看到直接内存的相关概念,为了更详细的了解一下具体原理,搜到了一篇不错的文章 http://lovestblog.cn/blog/2015/05/12/direct-buffer ...

  3. java softreference_Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference...

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  4. 【java.lang.ref】当WeakReference的referent重写了finalize方法时会发生什么

    问题 question:当WeakReference的referent重写了finalize方法时会发生什么? 测试代码 JVM中是存在这样的情况的:一个Java对象,重写了finalize方法,在使 ...

  5. 详细分析Android中的引用机制Reference(WeakReference、SoftReference、PhantomReference)

    目录 1.前言 2.四种引用 3.java.lang.ref 4.Reference 5.ReferenceQueue.enqueue(Reference) 6.ReferenceQueue.isEn ...

  6. Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别

    很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用WeakReference和Sof ...

  7. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...

    weakreference 很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用Wea ...

  8. 045_引用分类和WeakHashMap

    一. 引用分类 1. 强引用: StrongReference, 引用指向对象, gc(Garbage collection)运行时不回收对象. 2. 软引用: SoftReference, gc(G ...

  9. JAVA引用和垃圾回收

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: 1 Object o=new Object();   //  强引用 ...

最新文章

  1. 下划线转驼峰,并且首字母大写
  2. cmake简明使用指南
  3. 基于大数据与深度学习的自然语言对话
  4. 怎么在云服务器上建网站_云服务器怎么做安全维护
  5. CentOS编译安装php扩展gd
  6. mysql查询语句详解_基于mysql查询语句的使用详解
  7. [hackinglab][CTF][基础关][2020] hackinglab 基础关 writeup
  8. deque用法深度解析,一篇文章弄懂deque容器各种操作
  9. 解决GD中文乱码问题
  10. 使用 MonoGame* 开发游戏
  11. JavaWeb:Ajax和JSON
  12. 小学生应该学习编程语言
  13. VB通用对话框commom dialog中关于filterindex的设置
  14. linux vi编辑(20160628)
  15. OCR算法识别性能评估
  16. linux安装qq(deb文件)
  17. Rust 正则表达式 Regex
  18. asp.net打开新标签页
  19. Javaweb基础知识
  20. 【记第一次kaggle比赛】PetFinder.my - Pawpularity Contest 宠物预测

热门文章

  1. Tkinter的OptionMenu组件
  2. springboot根据环境装配配置文件、启动加载外置配置文件
  3. SonarQube4.4+Jenkins进行代码检查实例之二
  4. flutter项目迁移空安全
  5. 8-13 刷题 复习 知识点集合
  6. mysql starting server 失败_安装MySQL过程中(最后starting server)报错解决方案
  7. 神策数据受邀参加“两区”建设签约仪式
  8. 百度视频携手神策数据,引领基于 AI 的短视频推荐技术新潮流
  9. 付力力: 基于 ImpalaS 构建实时用户行为分析引擎
  10. sudo命令 和限制root 远程登陆