什么是引用

  引用就是保存着一块地址(门牌号)的对象,就像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. 001_Linux常用命令之ls命令

    1. 认识Linux系统目录结构 /bin 可执行文件所在目录 /media 挂载设备媒体,u盘,光驱等 /mnt 该目录主要是为了让用户挂在别的文件系统(挂在自己的u盘) /usr unix sys ...

  2. idea为本地项目创建仓库并git到云上

    1.为本地项目创建一个本地仓库: 2.在码云上创建一个仓库,(初始化的时候先不要创建README.md文件) 3.本地仓库关联远程仓库:右键项目选址git>>repository>& ...

  3. 服务认证(JWT)

    上一篇已经讲了微服务组件中的 路由网关(Zuul),但是未介绍服务认证相关,本章主要讲解基于Spring Security 与 JJWT 实现 JWT(JSON Web Token)为接口做授权处理… ...

  4. (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)

    官网 http://www.hzhcontrols.com/ 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kw ...

  5. SQL基础随记3 范式 键

    SQL基础随记3 范式 键 什么是范式?哈,自己设计会使用但是一问还真说不上来.遂将不太明晰的概念整体下   什么是 & 分类 范式(NF),一种规范,设计数据库模型时对关系内部各个属性之间的 ...

  6. docker安装,卸载和入门

    Docker 简介 背景 开发和运维之间因为环境不同而导致的矛盾 集群环境下每台机器部署相同的应用 DevOps(Development and Operations) 简介 Docker是一个开源的 ...

  7. CentOS7下安装Docker《超详细新手教程》

    1.使用 root 权限登录 Centos.确保 yum 包更新到最新. sudo yum update 2.卸载旧版本(如果安装过旧版本的话) sudo yum remove docker dock ...

  8. scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合

    1 流 Stream stream是一个集合.这个集合,可以用于存放无穷多个元素,但是这无穷个元素并不会一次性生产出来,而是需要用到多大的区间,就会动态的生产,末尾元素遵循lazy规则(即:要使用结果 ...

  9. 数据可视化之powerBI技巧(二十四)Power BI初学者刚见的错误,帮你轻松处理

    在学习PowerBI的过程中,尤其是刚接触的时候,不可避免的会遇到各种各样的错误,有时自己怎么检查都没法消除,不解决这个错误又没法进行下一步的工作,经常会搞的自己烦闷无比,不过最后通过自己的苦苦摸索. ...

  10. Django框架03 /视图相关

    Django框架03 /视图相关 目录 Django框架03 /视图相关 1. 请求相关 2.响应相关 3.FBV和CBV 视图(视图函数和视图类) 3.1 类视图 CBV 3.2 视图函数 FBV ...