Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用。包括:强引用,软引用,弱引用,虚引用。这篇博客将详细的讲解一下这四种引用。

1. 强引用

默认的Object object=new Object()的形式中,object即是对象new Object()的强引用,只有在object这个引用被释放后,对象才会被释放掉。这也是我们最常用的编码方式。如果一个引用是强引用,即使内存不足,GC也绝对不会回收它,而是宁可抛出OutOfMemoryError错误。

2. 软引用

如果一个对象仅有软引用,那么当内存充足时,GC不会回收它,当内存不足时,GC会对其回收。此时,需要通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;

软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

通常情况下,软引用可以和一个引用队列共同使用。即当软引用的对象被GC回收后,JVM把这个软引用加入与之关联的队列中。软引用实例如下:

ReferenceQueue referenceQueue=new ReferenceQueue();
SoftReference<Integer> softReference=new SoftReference<Integer>(new Integer(3),referenceQueue);
System.out.println("softReference.get(): "+softReference.get());//通过此方法获取软引用对象,可能会失败
System.out.println("softReference.isEnqueued(): "+softReference.isEnqueued());//返回是否被标记为即将回收的垃圾

运行结果如下

softReference.get(): 3
softReference.isEnqueued(): false

3. 弱引用

弱引用相较于软引用有更短的生命周期,一旦GC发现只具有弱引用的对象,无论当前内存是否不足,都会对其进行回收。GC是一个优先级(优先级的内容可以参考Java多线程:生命周期,实现与调度中3.4节:线程的优先级)很低的线程,不一定很快发现只具有弱引用的对象。弱引用的使用方法和软引用类似:

WeakReference<Integer> weakReference=new WeakReference<Integer>(new Integer(4),referenceQueue);
System.out.println("weakReference.get(): "+weakReference.get());//通过此方法获取软引用对象,可能会失败
System.out.println("weakReference.isEnqueued(): "+weakReference.isEnqueued());//返回是否被标记为即将回收的垃圾

运行结果如下,可以看出,GC并不会立即执行。

weakReference.get(): 4
weakReference.isEnqueued(): false

弱引用主要用于监控对象是否被标记为即将被回收的垃圾。与软引用类似,弱引用也可以和引用队列共同使用。

4. 虚引用

虚引用又称幽灵引用,不会决定对象的生命周期。如果一个对象仅存在一个虚引用,那么就和没有引用相同,任何时候都可能被GC回收。虚引用主要用于跟踪GC的活动。虚引用必须和引用队列联合使用,GC回收一个对象时如果发现有其虚引用就会先把虚引用置于引用队列中。此外,与弱引用的区别是,无法通过虚引用获取对象实例。

PhantomReference phantomReference = new PhantomReference (new Integer(5), referenceQueue);
System.out.println("phantomReference.get(): "+phantomReference.get());//通过此方法获取软引用对象,可能会失败
System.out.println("phantomReference.isEnqueued(): "+phantomReference.isEnqueued());//返回是否被标记为即将回收的垃圾

运行结果如下,可见,虚引用会立刻被GC回收,相当于没有引用。

phantomReference.get(): null
phantomReference.isEnqueued(): false

5. 参考文章

Java四种引用包括强引用,软引用,弱引用,虚引用。

Java基础:Java的四种引用的更多相关文章

  1. java 强弱软虚 四种引用,以及用到的场景

    1.利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的 ...

  2. Java基础 awt Font 四种字体样式

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  3. 【转载】Java的四种引用

    在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引 ...

  4. 转载:Java的四种引用方式

    原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...

  5. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  6. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  7. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

  8. Java虚拟机15:再谈四种引用状态

    JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...

  9. JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

    简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...

随机推荐

  1. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  2. PA模块常用表

    SELECT * FROM pa_projects_all; --项目 SELECT * FROM pa_project_types; --项目类型 SELECT * FROM pa_project_ ...

  3. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简介 1. 状态保存方法示例 p ...

  4. Ext.Net_1.X_WINDOW遮罩层被GridPanel挡住

    通过调试HTML代码,发现其实是DIV. chrome 中修改DIV Z:INDEX 就不被遮住了?但是又晓得如何修改window的Z:INDEX.那就修改"背景"GP的吧.

  5. 漫谈程序员(十一)老鸟程序员知道而新手不知道的小技巧之Web 前端篇

    老鸟程序员知道而新手不知道的小技巧 Web 前端篇 常充电!程序员只有一种死法:土死的. 函数不要超过50行. 不要一次性写太多来不及测的代码,而是要写一段调试一段. UI和编码要同步做. 多写注释方 ...

  6. PDA开发数据由DB下载至PDA本地

    public string DownFile = "\\下载.txt";//下载路径 public string LoadFile = "\\上传.txt";/ ...

  7. 打开Visual Studio 2010,左下角显示正在从包...加载工具箱内容,卡住5、6秒!!!

    在VS2010命令提示符用 devenv /ResetSkipPkgs 或者 devenv /ResetSettings

  8. C语言之将无符号字符型转化为ascii码值

    这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0  到 127 来表示 .那就对了 ...

  9. C++继承中的public/protected/private

    今天杨老师讲到C++的继承的时候用一个表来说明子类继承父类后访问权限的变化,如下表: 注:在本类中,protected与private是相同的,但protected可以被继承,而private却不行. ...

  10. Unity 数据Json格式的转换

    把对象转换为字节序列的过程称为对象的序列化. 把字节序列化恢复为对象过程称为对象的反序列化. JSON格式的转换,是一大神给我说的,让我拿来存储数据库时对一些数据的处理,感觉特别好用.但是我并没有深入 ...