什么是引用

  引用就是保存着一块地址(门牌号)的对象,就像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. Buy a Ticket 【最短路】

    题目 Musicians of a popular band "Flayer" have announced that they are going to "make t ...

  2. 同一WpfApplication下简单的页面转换

    别人写的很不错的Dome...分享学习下 源文件地址 : http://pan.baidu.com/share/link?shareid=1698564707&uk=3912660076

  3. Android 用视频做页面背景

    不知道怎么开头,直接代码. xml:RelativeLayout布局,MyVideoView放在第一位,其他的放到之下就可以. <MyVideoView android:id="@+i ...

  4. 图片文件分布式存储方案设计模式(c#--sqlserver)

    1.为了降低web服务器的压力,申请了2台文件服务器,用来存放图片文件.但是两台文件服务器如何让程序自己选择呢? 于是我用了一个算法,思路如下: 从状态表筛选出可用的图片服务器集合记作C,并获取集合的 ...

  5. 12.Clear Flags属性与天空盒

    选中Hierarchy面板的摄像机,然后在右侧Inspector面板的Clear Flags属性可以找到有如下选项, SkyBox:天空盒(默认效果,让场景看着有一个天空) Solid Color:固 ...

  6. day16 函数对象与闭包函数

    目录 一.函数对象 1.1函数可以被引用 1.2函数可以作为容器类型的元素 1.3函数可以作为参数传入另外一个函数 1.4函数的返回值可以是一个函数 二.闭包函数 1 什么是闭包函数 2 闭包函数的用 ...

  7. HTB::OpenAdmin

    实验环境 渗透过程 0x01 信息搜集 sudo nmap -sS -p1-10000 -sV -sC -T4 10.10.10.171 开放了22(SSH)端口和80(HTTP)端口 访问80端口, ...

  8. C#学习与个人总结

    本学期的C#相对来说,自我学习方法大有收获.但自律性.自我约束能力,我是否达到预期的最好效果,这个很难说出口.本学期在图书馆借了一本MySql.微机原理的书看了看,记了一些笔记.感觉知识有一些相同,有 ...

  9. python 三维散点插值 griddata

    #三维点插值#在三维空间中,利用实际点的值推算出网格点的值import numpy as np point_grid =np.array([[0.0,0.0,0.0],[0.4,0.4,0.4],[0 ...

  10. java 基本语法(五) 流程控制(二) 循环结构

    1.循环结构的四要素① 初始化条件② 循环条件 --->是boolean类型③ 循环体④ 迭代条件说明:通常情况下,循环结束都是因为②中循环条件返回false了. 2.三种循环结构:2.1 fo ...