JVM学习(五)对象的引用类型
一、引言
前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为;虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 ,但JVM可以屏蔽掉显式的垃圾回收调用,且JVM也有自己的一套垃圾回收机制,那么我们有没有什么办法可以“告诉”JVM,哪些对象是可以使用以后回收,哪些对象保留呢?这里就要说一下JAVA对象的引用类型了。
二、对象引用的简单介绍
- 强引用:无论内存是否足够,不会回收。
- 软引用:内存不足时,回收该引用关联的对象。
- 弱引用:垃圾回收时,无论内存是否足够,都会回收。
- 虚引用:任何时候都可能被垃圾回收器回收。
Java中提供这四种引用类型主要有两个目的:
- 1、让程序员通过代码的方式决定某些对象的生命周期;
- 2、第二是有利于JVM进行垃圾回收。
三、对象引用代码示例
强引用
强引用是我们使用的最广泛,也是最普遍的一种引用类型,常见的创建对象的方式就使用的强引用:
//1、强引用示例
String str = new String();
特点:
- 只要某个对象是强引用的,或者有强引用与之关联,JVM必定不会回收这个对象
- 内存不足的情况下,JVM会抛出OutOfMemory错误
- 需要回收时,可以显式设置此对象为null,JVM就会自行在垃圾回收发生时去回收此对象
软引用
软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象:
//2、软引用示例
SoftReference<String> softStr = new SoftReference<String>(new String("这是一个软引用类型的字符串对象"));
System.out.println(softStr.get());
软引用相对与强引用来说,比较好的解决了OOM【Out Of Memory】的问题,可以把一些有用的数据,但又不是核心的内容通过软引用的形式来设置,那么当内存不足时就可以回收释放空间了。常见应用如软引用一个图片对象等。
特点:
- SoftReference类包裹引用
- JVM内存不足时会回收【存在强引用关联时不回收】
弱引用
弱引用也是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.WeakReference类来表示。对于弱引用关联着的对象,当JVM进行垃圾回收时,无论内存是否充足,都会回收:
//3、弱引用示例
WeakReference<String> weekStr = new WeakReference<String>(new String("这是一个弱引用类型的字符串对象"));
System.out.println(weekStr.get());
//显式调用JVM垃圾回收
System.gc();
//输出弱引用的内容【此时会输出null,因为在显式调用垃圾回收的时候,弱引用对象的内容已经被回收了】
System.out.println(weekStr.get());
PS:如果弱引用对象有对应的强引用关联,那么垃圾回收时是不会回收此弱引用的【软引用也类似】
特点:
- WeakReference类包裹引用
- JVM无论内存充足与否均会在垃圾回收时回收【存在强引用关联时不回收】
虚引用
虚引用不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
//4、虚引用示例
//4.1、创建一个引用队列【虚引用必须跟引用队列关联使用】
ReferenceQueue<String> queue = new ReferenceQueue<String>();
//4.2、创建一个虚引用包裹一个字符串对象的引用地址
PhantomReference<String> phantomStr = new PhantomReference<String>(new String("这是一个虚引用类型的字符串对象"), queue);
//4.3、输出引用内容【结果发现输出为null】
System.out.println(phantomStr.get());
特点:
- PhantomReference类包裹引用
- 任何时候都可能被垃圾回收器回收
- 必须跟引用队列关联使用
引用队列(ReferenceQueue)
作用:
- 用于监听Reference所指向的对象是否已经被垃圾回收。
使用场景:
- 当大量使用各种引用(Reference)来包裹实例对象时,虽然引用(Reference)指向的对象可能被回收了,但Reference本身也是个对象,所以也需要回收,这时就需要使用ReferenceQueue了。
回收模式上的区别:
- 当SoftReference或WeakReference的get()加入ReferenceQueue或get()返回null时,仅是表明其指示的对象已经进入垃圾回收流程,此时对象不一定已经被垃圾回收。
- 当PhantomReference加入ReferenceQueue时,则表明对象需要且已被回收【PS:所以虚引用的例子的4.3步骤,调用get方法时返回会为null】。
JVM学习(五)对象的引用类型的更多相关文章
- JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍
1.原型模式的重要性不仅仅体现在创建自定义类型方面,就连所有的原生的引用类型(Obejct.Array.String等等)都在构造函数的原型上定义方法和属性.如下代码可以证明: alert(typeo ...
- JVM学习03_new对象的内存图讲解,以及引出static方法(转)
目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -= ...
- JVM学习五:JVM之类加载器之编译常量和主动使用
在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点. 一.类的初始化回顾 类在初始化的时候,静态变量的声明语句 ...
- JVM学习之对象的状态
堆中存放着几乎所有的对象实例,垃圾收集器在堆堆进行回收前,首先要确定这些对象哪些还“活着”,哪些已经“死去”.方法有如下两种: (1)引用计数法 算法思想:为对象添加一个引用计数器,每当有一个地方引用 ...
- Hibernate基础学习(五)—对象-关系映射(下)
一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...
- jvm学习记录-对象的创建、对象的内存布局、对象的访问定位
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...
- JVM学习记录-对象已死吗
前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器.在线程私有部分的三个区域是随着线程生和灭的.栈 ...
- JVM学习--(五)垃圾回收器
上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...
- JVM学习-之对象的创建和内存分配
最近看JVM内存模型,看了很多文章,大都讲到JVM将内存区域划分分:Mehtod-Area(No heap) 方法区,Heap(堆)区,Program Counter Register(程序计数器), ...
- JVM学习五:性能监控工具
一.系统性能监控 系统性能工具用于确定系统运行的整体状态,基本定位问题所在. Linux – uptime • 系统时间 • 运行时间 n 例子中为7分钟 • 连接数 n 每一个终端算一个连接 • 1 ...
随机推荐
- windows下cmd命令行计算文件hash值
命令:certutil -hashfile certutil -hashfile D:\.exe MD5 certutil -hashfile D:\.exe SHA1 certutil -hashf ...
- 数据中台实战(一):以B2B电商亿订为例,谈谈产品经理视角下的数据埋点
本文以B2B电商产品“亿订”为实例,与大家一同谈谈数据中台的数据埋点. 笔者所在公司为富力环球商品贸易港,是富力集团旗下汇聚原创设计师品牌及时尚买手/采购商两大社群,通过亿订B2B电商.RFSHOWR ...
- C++ strcmp与strncmp的比较
C++ strcmp与strncmp的比较(转载) 原文链接:https://www.cnblogs.com/ybqjymy/p/12565444.html strcmp与strncmp都是用来比较 ...
- python实例 三国人物出场次序 jieba库
#Cal3kingdoms.py import jieba txt = open("threekingdoms.txt", "r", encoding=&quo ...
- sha1sum校验方法
sha1sum校验方法,我们可以保存到一个文件中.还可以根据已经得到的hash来确认文件.MD5类似. [root@ffcs211 test_dir]# sha1sum New.EXE 3fe44e8 ...
- 文件属性及find命令总结
第1章 文件属性 1.1 文件的属性 1.1.1 查看文件的详细属性 PS:ls查看的文件或目录默认的是按照名字的第一个字母进行正序排序 ls 参数选项: -t ...
- xml selectnodes
[xML ]SelectNodes的用法 之前简单找个SelectNodes的例子看了看,写了读取XML文件节点的程序,但是节点数目有限制,后来仔细看看,是自己没完全弄清SelectNodes的用法, ...
- iOS审核被拒大全
崩溃和bug 当你完成应用开发并准备发布时应该将App提交审核.在提交审核前,要确保已经在设备上对应用程序进行了彻底的测试,修复了所有的bug. 断掉的链接 应用程序中所有的链接必须是功能性的.对于所 ...
- Animator.SetFloat(string name,float value,float dampTime,float deltaTime)详解
一般来说,我们用到的是这个API: animator.SetFloat("Speed",2.0f); 但是这个还有一个重载的方法,叫做: Animator.SetFloat(str ...
- 题解 洛谷P3799 【妖梦拼木棒】
一道水题 (还是做了一个小时,我太菜了 基本思路: 题里面说,4根棍子拼成一个正三角形(等边三角形) 若设这四根棍子长度为\(a,b,c,d\)且\(a≥b>c≥d\) 那很容易得到 (真的很容 ...