你不知道的Java引用
什么是引用
引用就是保存着一块地址(门牌号)的对象,就像C语言的指针那样,引用可以传递某个数据的地址,如果我们想拿到某一条数据,就要先找到他的地址,然后告诉计算机我去拿这个地址的数据,最后计算机就会去磁盘拿到我们要的数据。
其实,在学Java的时候我们就知道了Java的类型可分为基本类型与引用类型
java基本类型有int,shout,long,float,double,byte,char,boolean;
java引用类型:除了基本类型基本都是,例如:对象,数组;
但是我们不断的增加引用,就要不断的消耗内存空间,最后就容易内存溢出和泄漏,所以为了适应不同的场景,Java将引用分为强引用,弱引用,软引用,徐引用4种不同的类型方便垃圾回收,这样我们就知道那些引用什么时候你要用的,那些是不用准备回收的。总结一句话,Java引用分类的目的是为了对垃圾回收的进一步优化。
下面是对Java不同引用特点、使用场景的举例
A1(强引用)
A2(特点)
A3(回收)
A4(使用场景)
A21("1. 空间不回收")
A22("2. 虚拟机抛出OutMemoryError也不回收")
A31("1. 显示赋值为空")
A32("2. 强引用转为软引用")
A33("3. 方法局部强引用变量")
A34("4. 方法栈退出引用不存在时")
A41("1. 全局配置变量")
A42("2. 方法栈局部变量")
A43("2. 方法栈返回对象或强引用逃逸")
A1---A2
A2---A21
A2---A22
A1---A3
A3---A31
A3---A32
A3---A33
A3---A34
A1---A4
A4---A41
A4---A42
A4---A43
B1("软引用")
B2("特点")
B3("回收")
B4("使用场景")
B5("例子")
B21("1. 空间不足就回收")
B22("2. 关键词:SoftReference")
B31("1. 空间不足,易被回收")
B32("2. 空间足够,不会回收")
B41("1. 使用例子")
B42("1.1 String str = new String('hh');<br> SoftReference soft = new SoftReference(str);<br>str = null; //有可能被回收,则返回null <br> String str2 = soft.get()")
B43("2. 可以实现内存敏感型高速缓存")
B44("2.1 二级缓存缓解Redis缓存的压力")
B45("2.2 Object obj = new Object();<br>JedisHelper.put(key,obj); <br> SoftReference sfobj = new SoftReference(obj); <br> ... <br> if(sfobj.get()!=null) { <br>Object obj = (Object)sfobj.get();//未被回收 <br>}else { <br> obj = JedisHelper.get(key);//内存吃紧,被回收 <br> SoftReference sfobj = new SoftReference(obj); //重建软引用 <br> }")
B51("有一个应用需要读取大量的本地图片,如果每次都从硬盘读取,<br> 则会严总影响性能,但是如果全部加到内存中,则可能会内存溢出,<br> 此时使用软引用就可以解决这个问题")
B1---B2
B2---B21
B2---B22
B1---B3
B3---B31
B3---B32
B1---B4
B4---B41
B4---B42
B4---B43
B4---B44
B4---B45
B1---B5
B5---B51
C1("弱引用")
C2("特点")
C3("回收")
C4("使用场景")
C5("例子")
C21("1. 发现就回收")
C22("2. 何时回收不确定")
C31("1. 被扫描到就回收")
C32("2. 生命周期短暂")
C33("3.第二次垃圾回收时回收")
C41("1. 避免手动置空")
C42("2 有价值的被cache")
C43("3. 很容易被重新构建")
C44("4. 很消耗内存的对象")
C51("Thread Local 就是弱引用")
C52("WeakHashMap中的key就是弱引用")
C1---C2
C2---C21
C2---C22
C1---C3
C3---C31
C3---C32
C3---C33
C1---C4
C4---C41
C4---C42
C4---C43
C4---C44
C1---C5
C5---C51
C5---C52
D1("虚引用")
D2("特点")
D3("回收")
D4("使用场景")
D5("例子")
D21("任何时候被回收")
D22("幽灵引用")
D31("任何时候都可能被垃圾回收器回收")
D41("1. 虚引用大多被用于引用销毁前的处理工作")
D42("2 对象销毁前,资源释放")
D43("3. 精细的内存使用控制")
D44("4. 标记虚引用,已准备好回收")
D51("代替Object.finalize方法释放资源")
D1---D2
D2---D21
D2---D22
D1---D3
D3---D31
D1---D4
D4---D41
D4---D42
D4---D43
D4---D44
D1---D5
D5---D51
归类总结
| 引用类型 | 被回收时间 | 用途 | 生存时间 |
|---|---|---|---|
| 强引用 | 从来不会 | 对象的一般状态 | jvm停止运行时终止 |
| 软引用 | 在内存不足时 | 对象缓存 | 内存不只是终止 |
| 弱引用 | 在垃圾回收时 | 对象缓存 | Gc运行后终止 |
| 虚引用 | 在任何时候时 | 释放资源 | Gc运行后终止 |
GC即使Java的垃圾回收器的简称
你不知道的Java引用的更多相关文章
- Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference
Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...
- 4种Java引用浅解
近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...
- Java引用类型变量
Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定 类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博 ...
- Java引用变量的类型
Java引用变量的类型 1.编译时类型:由声明该变量时使用的类型决定 2.运行时类型:由实际赋给该变量的对象决定 如果编译时类型和运行时类型不一致,就可能出现多态性
- Java引用详解-StrongReference SoftReference WeakReference PhantomReference
1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为: 强引用 > 软引用 > 弱引用 > 虚引用 ⑴强引用(StrongR ...
- 浅谈Java引用和Threadlocal的那些事
这篇文章主要介绍了Java引用和Threadlocal的那些事,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1 背景 某一天在某一个群里面的某个群友突然提出了一个问 ...
- java引用知识
最近从新拜读<深入理解Java虚拟机:JVM高级特性与最佳实践>这本书,看到有关引用的相关知识,以前没有好的习惯,这次看完在博客上记录下 引用:如果reference类型中的数据存储的数值 ...
- Java引用与C语言指针的区别
1.现象 指针在运行时可以改变其所指向的值(地址)即指向其它变量,而引用一旦和某个对象绑定后就不能再改变,总是指向最初的对象. 2.编译 程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变 ...
- Java引用的分类
Java引用分为强引用.软引用.弱引用和虚引用. 强引用就是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被 ...
随机推荐
- 51单片机入门(补充)1--与C语言的交接
我写完上一个文章,发现我写的还是不够全面,所以,这篇文章将会延续上一个文章的内容,并且再次补充新的东西,如果还有什么地方需要补充,还请各位一一指出,如果你已经学过这些东西,大可以直接跳过,假如说之后有 ...
- 洛谷 P2296 【寻找道路】
这道题真的很女少啊 言归正传: 这道题其实就是考验的思路,读题后,我们发现对于某个点他所连接的点必须连接终点,那么我们直接反向存图,从终点进行bfs,可以找到未连接的点,然后对这些点所连接的点进行标记 ...
- 部署LNMP环境——Yum安装(113资讯网)
Yum安装优点:安装东西,方便快捷,特别是不用考虑包依赖 教程(Centos做演示,其他系统大同小异): 1.更换国内Yum源: [root@root xx ]# rm -rf /etc/yum.re ...
- JAVA基础笔记15-16-17-18
十五.今日内容介绍 1.Object 2.String 3.StringBuilder =第一节课开始======================= 01API概念 * A:API(Applicati ...
- arm64-v8a 静态成员模板 undefined reference to
谷歌发布新包需要64位的so Application.mk 中 APP_ABI := armeabi armeabi-v7a x86 x86_64 arm64-v8a 添加了 arm64-v8a 和 ...
- Error: error getting chaincode bytes: failed to calculate dependencies报错解决办法
Error: error getting chaincode bytes: failed to calculate dependencies: incomplete package: github.c ...
- C#读取Excel转换为DataBle
/// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...
- WPF 最基本的前后台代码对照
最基本的3D代码对照 xaml代码 <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera Position=" ...
- (一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore
想深入了解OrchadCore源码许久了,但是读源码的时候遇到很多问题而网上的参考资料太少了(几乎都是OrchadCms不带OrchardCore的),现在解决得差不多了,做下笔记方便自己查看,有错误 ...
- AMAP-TECH算法大赛开赛!基于车载视频图像的动态路况分析
阿里巴巴高德地图AMAP-TECH算法大赛于7月8日开启初赛,赛题为「基于车载视频图像的动态路况分析」,活动邀请了业界权威专家担任评委,优秀选手不仅可以瓜分丰厚的奖金,领取荣誉证书,还有机会进入高德地 ...