你不可不知的Java引用类型【总结篇】
四种引用类型总结
引用级别:强引用 > 软引用 > 弱引用 > 虚引用
理解
就如最开始说的,设置四种引用类型,是为了更好的控制对象的生命周期,让代码能够一定程度上干涉GC过程,所以引用类型主要就是跟垃圾回收有关了。
对于JVM、GC和内存,可以这样理解,内存好比你的抽屉,这个抽屉有一定大小,并不能无限存放东西。
JVM好比你自己,会时不时来整理抽屉。那些申请的对象好比放在抽屉里的东西,生活中的必需品就好比强引用,而那些可能用到的东西(非必需品)就好比软引用或者弱引用。
当抽屉还很空的时候,放一些非必须品你也不会在意,但是随着买的东西越来越多,抽屉里快放不下的时候,就需要根据重要程度来选择一些东西扔出抽屉,这个过程就好比GC。
JVM在内存够用的时候,不会对软引用的对象进行回收,但是当内存紧张的时候,就会对它们进行清理。
四种引用类型对比
| 引用类型 | 引用对象被垃圾回收的时间 | 用途 | 是否可以转为强引用 | 对应的类 |
|---|---|---|---|---|
| 强引用 | 从来不会 | 一般用途,保持对象不被回收 | 可以 | 默认 |
| 软引用 | 发生一次GC后,JVM决定还需要进一步回收更多空间时 | 缓存,保持对象在内存足够时不被回收 | 可以 | SoftReference |
| 弱引用 | 进行垃圾回收时,如果对象只存在弱引用 | 缓存,仅仅在对象仍被使用时保持其不被回收 | 可以 | WeakReference WeakHashMap |
| 虚引用 | 进行垃圾回收时 | 跟踪GC过程,在对象被回收前进行一些清理工作 | 不可以 | PhantomReference |
题外话
emmmm….总觉得少了点什么,有没有想过,为什么没有StrongReference类?
嗯,讲道理,软引用,弱引用,虚引用都有其对应的类,为什么强引用却没有?试想一下,如果有StrongReference类,那么在自定义缓存中进行引用类型判断时将会比较方便,事实上,在guava的LocalCache中,确实构造了一个StrongValueReference的类,用来包裹一个强引用。
所以当你想要自己造缓存的轮子时,可以先看看人家的轮子好不好用。
至此,这一系列就算告一段落了,为了写这一系列文章,花了不少心思,离底层实现越来越近的感觉就像山洞探险,这个探索过程的曲径通幽,柳暗花明处其实就是最好的奖励。
对于学习,就像是打通经脉的过程,从一个一个零散的点,到慢慢将它们贯通成线,点与点的联结会让人产生极大的快感,最终如果能将这些点编织成网,便像打通奇经八脉那样,知识不过是手到擒来了。
(这个B装的不错,还多了一些细节在里面,哈哈哈哈,溜了溜了)
你不可不知的Java引用类型【总结篇】的更多相关文章
- 你不可不知的Java引用类型之——SoftReference源码详解
定义 SoftReference是软引用,其引用的对象在内存不足的时候会被回收.只有软引用指向的对象称为软可达(softly-reachable)对象. 说明 垃圾回收器会在内存不足,经过一次垃圾回收 ...
- 你不可不知的Java引用类型之——ReferenceQueue源码详解
定义 ReferenceQueue是引用队列,用于存放待回收的引用对象. 说明 对于软引用.弱引用和虚引用,如果我们希望当一个对象被垃圾回收器回收时能得到通知,进行额外的处理,这时候就需要使用到引用队 ...
- 你不可不知的Java引用类型之——虚引用
定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...
- 你不可不知的Java引用类型之——弱引用
定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱 ...
- 你不可不知的Java引用类型之——软引用
定义 软引用是使用SoftReference创建的引用,强度弱于强引用,被其引用的对象在内存不足的时候会被回收,不会产生内存溢出. 说明 软引用,顾名思义就是比较"软"一点的引用. ...
- 你不可不知的Java引用类型之——强引用
定义 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryError)也不会回收它. 说明 不要被这个强字吓到,以为这个引用就很厉害,其实强引用就是程序 ...
- 你不可不知的Java引用类型之——Reference源码解析
定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...
- 你不可不知的Java引用类型之——PhantomReference源码详解
定义 PhantomReference是虚引用,该引用不会影响不会影响对象的生命周期,也无法从虚引用中获取对象实例. 说明 源码介绍部分其实也没多大内容,主要内容都在前面介绍中说完了.PhantomR ...
- 你不可不知的Java引用类型之——WeakReference源码详解
定义 WeakReference是弱引用,该引用不会影响垃圾回收器对对象的回收,不会影响对象的生命周期. 说明 当虚拟机在某个时间点决定要回收一个弱可达(weakly-reachable)对象时,会自 ...
随机推荐
- 如何批量添加图片到ppt的方法
如何批量添加图片到ppt 许多时候会做一些幻灯片,需要大量的图片,但是往往一张以张的加图片,会很浪费时间,如何快速添加图片,一次解决呢? 步骤:插入-相册-点击相册 点击文件,批量选择你要插入的图片, ...
- odoo开发笔记--取消正在升级中模块
场景描述: 开发过程中,有时候会遇到,模块安装的时候,一直卡着,走不过去:或者安装报错,导致进入了系统! 这个时候,怎么处理呢? 先简单说下,odoo中模块的升级有4个状态,模块相关的安装情况记录在表 ...
- vue Do not use built-in or reserved HTML elements as component id: nav
刚入坑vue 在新建组件的时候出现这个问题,原因是我新建的这个组件name: 'nav' 在vue中好像nav 这样的 有点类似于 “关键字” 不能作为组件的name,按照服务端来说 就是不可以命名关 ...
- Microsoft 机器学习产品体系对比和介绍
Microsoft 提供多种多样的产品选项用于生成.部署和管理机器学习模型. 本文将比较这些产品,并帮助你选择所需的产品,以便最有效地开发机器学习解决方案. 机器学习产品 描述 作用 Azure云端服 ...
- CentOS 7配置MariaDB允许指定IP远程连接数据库
防火墙 CentOS7 之前的防火墙是不一样的,比如你要添加3306端口: ## 全部 iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT # ...
- Mysql 锁和锁算法
相关命令: show engines; 查看数据库支持的引擎 show variables like '%storage_engine%'; 查看数据库默认的引擎 select @@global ...
- 32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
32位第五讲,逆向实战干货,快速定位扫雷内存. 首先,在逆向之前,大家先对OD有一个认识. 一丶OD的使用 标号1: 反汇编窗口 (显示代码的地址,二进制指令,汇编代码,注释) 标号2: 寄存器窗口( ...
- Linux常用命令之压缩和解压缩命令
目录 1.压缩解压缩格式 .gz 一.将文件压缩为 .gz 格式,只能压缩文件:gzip 二.将 .gz 文件解压:gunzip 2.压缩解压缩格式 .tar.gz 一.将文件或目录压缩为 .tar. ...
- SpringMVC学习(三)———— springmvc的数据校验的实现
一.什么是数据校验? 这个比较好理解,就是用来验证客户输入的数据是否合法,比如客户登录时,用户名不能为空,或者不能超出指定长度等要求,这就叫做数据校验. 数据校验分为客户端校验和服务端校验 客户端校验 ...
- 关于 Cortex-M3 的双堆栈机制
CM3 的堆栈分为两个:主堆栈和进程堆栈. 那么,这两个栈分别在什么情况下使用呢? 我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针. CON ...