Java基础:Java的四种引用
在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.利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的 ...
- Java基础 awt Font 四种字体样式
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- 【转载】Java的四种引用
在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引 ...
- 转载:Java的四种引用方式
原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- Java 中的四种引用及垃圾回收策略
Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...
- Java虚拟机15:再谈四种引用状态
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...
- JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例
简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...
随机推荐
- Leetcode_160_Intersection of Two Linked Lists
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41593747 Intersection of Two Li ...
- 【翻译】了解Ext JS 5的小部件
原文:Understanding Widgets in Ext JS 5 在Ext JS 5,引入了新的"widgetcolumn",支持在网格的单元格中放置组件.同时,还在Ext ...
- [转]ubuntu安装vncserver实现图形化访问
请注意: 如果在安装中部分软件无法安装成功,说明软件源中缺包,先尝试使用命令#apt-get update更新软件源后尝试安装.如果还是不行,需要更换软件源.更换步骤: 1)输入命令#cp /et ...
- [面试算法题]比较二叉树异同-leetcode学习之旅(5)
问题描述 Given two binary trees, write a function to check if they are equal or not. Two binary trees ar ...
- TortoiseGit安装过程
运行TortoiseGit-1.7.7.0-32bit.msi,如下图 点击Next, 下一步 点击Next, 下一步 选择ssh客户端, 使用默认, 点击Next, 下一步 选择安装路径, 点 ...
- 移动App设计的十条建议
原文链接: 10 Key Design Tips for Great Mobile Apps 原文日期: 2014年03月24日 翻译日期: 2014年04月01日 使用Android和iOS编写一个 ...
- 《java入门第一季》之面向对象(private关键字与封装概念的初探)
/* 定义一个学生类: 成员变量:name,age 成员方法:show()方法 在使用这个案例的过程中,发现了一个问题: 通过对象去给成员变量赋值,可以赋值一些非法的数据.例如:name你赋值了一个3 ...
- MTK 软件设置路径
1. uboot路径 mediatek\custom\common\uboot\logo\hvga\hvga_kernel.bmp mediatek\custom\common\uboot\logo\ ...
- Java进阶(十六)使用new Date()和System.currentTimeMillis()获取当前时间戳
java使用new Date()和System.currentTimeMillis()获取当前时间戳 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可 ...
- 【Matlab编程】马氏链随机模拟
本文是利用蒙特卡罗算法对马氏链过程的模拟.假设有10个状态,从每个状态到与之相邻状态的概率是相同的,仿真次数为1000,及进行了1000次状态转移.我们以动画的形式再现了状态转移的过程,并记录了到达每 ...