什么是引用

  引用就是保存着一块地址(门牌号)的对象,就像C语言的指针那样,引用可以传递某个数据的地址,如果我们想拿到某一条数据,就要先找到他的地址,然后告诉计算机我去拿这个地址的数据,最后计算机就会去磁盘拿到我们要的数据。

  其实,在学Java的时候我们就知道了Java的类型可分为基本类型与引用类型

java基本类型有int,shout,long,float,double,byte,char,boolean;

java引用类型:除了基本类型基本都是,例如:对象,数组;

  但是我们不断的增加引用,就要不断的消耗内存空间,最后就容易内存溢出和泄漏,所以为了适应不同的场景,Java将引用分为强引用,弱引用,软引用,徐引用4种不同的类型方便垃圾回收,这样我们就知道那些引用什么时候你要用的,那些是不用准备回收的。总结一句话,Java引用分类的目的是为了对垃圾回收的进一步优化。

下面是对Java不同引用特点、使用场景的举例

graph LR
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

graph LR

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

graph LR

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

graph LR

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引用的更多相关文章

  1. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  2. 4种Java引用浅解

    近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...

  3. Java引用类型变量

    Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定    类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博 ...

  4. Java引用变量的类型

    Java引用变量的类型 1.编译时类型:由声明该变量时使用的类型决定 2.运行时类型:由实际赋给该变量的对象决定    如果编译时类型和运行时类型不一致,就可能出现多态性

  5. Java引用详解-StrongReference SoftReference WeakReference PhantomReference

    1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongR ...

  6. 浅谈Java引用和Threadlocal的那些事

      这篇文章主要介绍了Java引用和Threadlocal的那些事,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1 背景 某一天在某一个群里面的某个群友突然提出了一个问 ...

  7. java引用知识

    最近从新拜读<深入理解Java虚拟机:JVM高级特性与最佳实践>这本书,看到有关引用的相关知识,以前没有好的习惯,这次看完在博客上记录下 引用:如果reference类型中的数据存储的数值 ...

  8. Java引用与C语言指针的区别

    1.现象 指针在运行时可以改变其所指向的值(地址)即指向其它变量,而引用一旦和某个对象绑定后就不能再改变,总是指向最初的对象. 2.编译 程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变 ...

  9. Java引用的分类

    Java引用分为强引用.软引用.弱引用和虚引用. 强引用就是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被 ...

随机推荐

  1. Java多线程之synchronized详解

    目录 synchronized简介 同步的原理 对象头与锁的实现 锁的优化与升级 Monitor Record 锁的对比 synchronized简介 synchronized关键字,一般称之为&qu ...

  2. abp + vue 模板新建页面

    新建页面 创建按对应的模块和实体 新建的模块需要进行注册

  3. NXP S32V eiq_auto tensorflow offline tool 环境配置

    NXP S32V eiq_auto tensorflow offline tool 环境配置 完成cnn模型eiq移植的第一步 1.安装conda 下载.sh bash Anaconda3-5.3.1 ...

  4. 如何实现html页面自动刷新

    使用场景: 1. 页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新) 2. 一定时间之后跳转到指定页面(登录注册之类) 3. 前端开发使用伪数据 ...

  5. PTP时钟和NTP时钟同步有什么区别

    PTP时钟 理论上任何PTP时钟都能实现主时钟和从时钟的功能,但一个PTP通信子网内只能有一个主时钟.整个系统中的最优时钟为最高级时钟GMC(Grandmaster Clock),有着最好的稳定性.精 ...

  6. 状压DP之LGTB 与序列

    题目 思路 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭 \(A_i\)<=30,所以我们只需要考虑1-58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的, ...

  7. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  8. C++左值引用与右值引用

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/references-cpp?view=vs-2019 引用,类似于指针,用于存储一个位于内存某处的对象的 ...

  9. 数据可视化之DAX篇(七) Power BI中用DAX生成的表如何添加索引列?

    ​https://zhuanlan.zhihu.com/p/74732578 来源于知识星球中一个星友的问题,使用DAX在PowerBI中新建了一个表,如何为这个表添加索引列呢? 假如数据模型中只有一 ...

  10. js 声明变量规范和特殊变量情况

    声明变量特殊情况    情况 说明 结果 var age ; console.log (name); 只声明 不赋值 undefined console.log(name) 不声明 不赋值  直接使用 ...