什么是引用

  引用就是保存着一块地址(门牌号)的对象,就像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. 如何判断一个String字符串不为空或这不为空字符串

    如何判断一个String字符串不为空或这不为空字符串 转载兵哥LOVE坤 最后发布于2018-07-27 00:00:05 阅读数 5144  收藏 展开 1.校验不为空:   String str ...

  2. .net core 使用 swagger 生成接口文档

    微软参考文档:https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs= ...

  3. angular弹出对话框结构

    angular dialog标准结构,注意有checkbox时,需要外包一层div,checkbox-wrapper类的这个样式控制了不显示滚动条.

  4. mat-paginatoor控件

    pageNumber是点击搜索查询后,跟新的变量值. import { MatPaginatorIntl } from '@angular/material'; const getRangeLabel ...

  5. PHPstorm常用快捷键(Windows)

    本文整理本人在日常工作中使用最频繁的PHPstorm快捷键,以作为自己的总结备忘,也希望能够帮到有需要的小伙伴. 以下快捷键大致按本人的使用频率从高到低来介绍. 1.复制.粘贴 Ctrl+c .Ctr ...

  6. 「疫期集训day9」七月

    我们暂时被击退了,可恶的德国佬----我们集结了英国人,意大利人,荷兰人,澳大利亚人,来自世界各地,我们万众一心,还能失守亚眠?----亚眠中坚守的协约国士兵 日常考爆,T1貌似全场就我傻乎乎的推式子 ...

  7. 最简单的博弈论——HDU - 5963 朋友 (博弈)

    OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...

  8. mac篇---iterm2的基本常用命令

    标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:comma ...

  9. 关于点击input框唤醒键盘导致input被遮盖的问题

    关于点击input框唤醒键盘导致input被遮盖的问题 这个问题相信大家在实际开发过程当中都有遇见,我自己也遇见过很多次.之前在百度上看见大多数的方法利用的都是键盘唤醒了之后,页面的实际高度会发生变化 ...

  10. CCNA-Part5 - 传输层 ,TCP 为什么是三次握手?

    传输层 传输层主要的作用就是建立端到端的连接.比如电脑的微信的通信,就需要跨越多个网络设备(交换机和录取)再和微信的服务器建立连接. 传输层需要具有以下的特点: 会话的多复用:如电脑上开启的多个应用, ...