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. 自定义gradle的property

    在android studio上运行项目,gradle的配置是必不可少的,但是随着项目的逐渐成长,迎面而来的就是.各种依赖包的添加,数不胜数的签名,渠道包等,整个gradle变得很乱,这样其实我们可以 ...

  2. Linux进程实践(4) --wait避免僵尸进程

    Wait的背景 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程 ...

  3. 理解WebKit和Chromium: 硬件加速之RenderLayer树到合成树

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 在前面的章节中,笔者介绍了WebKit渲染引擎是如何有HTML网页构建DOM树.RenderObject ...

  4. 使用GDAL工具对FY3系列卫星数据进行校正

    本文档主要对如何使用GDAL提供的工具对FY3系列卫星数据进行校正处理.FY3系列卫星提供的数据一般是以HDF5格式下发,一个典型的FY3A和FY3B的数据文件名如下: FY3A_MERSI_GBAL ...

  5. Cocos2d中update与fixedUpdate的区别(六)

    它如何工作呢? update:和fixedUpdate:方法实际这样工作. Cocos2D将从iOS接口中取得时间间隔(delta)在你的游戏代码执行期间,并且检查fixedUpdate:方法在间隔期 ...

  6. Android OnLowMemory和OnTrimMemory

    1.OnLowMemory 是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory. 系统提 ...

  7. 知名IT公司的年度大会合集

    很多知名的IT公司都有年度大会,比如说谷歌,微软,Adobe,甲骨文,苹果等等.在这些公司的年度大会上,都会展示一些公司比较前沿的产品.看看这些大会的视频(也可以参会,但是门票可是非常贵的),对我们了 ...

  8. 树莓派linux驱动学习之LED控制

    前面我们编写了hello world的程序,接下来继续研究GPIO功能,通过GPIO来控制LED的亮灭,这在单片机中应该算是十分简单的一个程序了,但是在Linux系统中控制GPIO没有那么简单,难点就 ...

  9. HTTP2概述

    HTTP/2 提供了HTTP语义的传输优化.HTTP/2支持所有HTTP/1.1的核心特征,并且在其他方面做的更高效. HTTP/2中基本的协议单位是帧.每个帧都有不同的类型和用途.例如,报头(HEA ...

  10. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...