四种引用类型总结

引用级别:强引用 > 软引用 > 弱引用 > 虚引用

理解

就如最开始说的,设置四种引用类型,是为了更好的控制对象的生命周期,让代码能够一定程度上干涉GC过程,所以引用类型主要就是跟垃圾回收有关了。

对于JVM、GC和内存,可以这样理解,内存好比你的抽屉,这个抽屉有一定大小,并不能无限存放东西。

JVM好比你自己,会时不时来整理抽屉。那些申请的对象好比放在抽屉里的东西,生活中的必需品就好比强引用,而那些可能用到的东西(非必需品)就好比软引用或者弱引用。

当抽屉还很空的时候,放一些非必须品你也不会在意,但是随着买的东西越来越多,抽屉里快放不下的时候,就需要根据重要程度来选择一些东西扔出抽屉,这个过程就好比GC。

JVM在内存够用的时候,不会对软引用的对象进行回收,但是当内存紧张的时候,就会对它们进行清理。

四种引用类型对比

引用类型 引用对象被垃圾回收的时间 用途 是否可以转为强引用 对应的类
强引用 从来不会 一般用途,保持对象不被回收 可以 默认
软引用 发生一次GC后,JVM决定还需要进一步回收更多空间时 缓存,保持对象在内存足够时不被回收 可以 SoftReference
弱引用 进行垃圾回收时,如果对象只存在弱引用 缓存,仅仅在对象仍被使用时保持其不被回收 可以 WeakReference
WeakHashMap
虚引用 进行垃圾回收时 跟踪GC过程,在对象被回收前进行一些清理工作 不可以 PhantomReference

题外话

emmmm….总觉得少了点什么,有没有想过,为什么没有StrongReference类?

嗯,讲道理,软引用,弱引用,虚引用都有其对应的类,为什么强引用却没有?试想一下,如果有StrongReference类,那么在自定义缓存中进行引用类型判断时将会比较方便,事实上,在guava的LocalCache中,确实构造了一个StrongValueReference的类,用来包裹一个强引用。

所以当你想要自己造缓存的轮子时,可以先看看人家的轮子好不好用。

至此,这一系列就算告一段落了,为了写这一系列文章,花了不少心思,离底层实现越来越近的感觉就像山洞探险,这个探索过程的曲径通幽,柳暗花明处其实就是最好的奖励。

对于学习,就像是打通经脉的过程,从一个一个零散的点,到慢慢将它们贯通成线,点与点的联结会让人产生极大的快感,最终如果能将这些点编织成网,便像打通奇经八脉那样,知识不过是手到擒来了。

(这个B装的不错,还多了一些细节在里面,哈哈哈哈,溜了溜了)

你不可不知的Java引用类型【总结篇】的更多相关文章

  1. 你不可不知的Java引用类型之——SoftReference源码详解

    定义 SoftReference是软引用,其引用的对象在内存不足的时候会被回收.只有软引用指向的对象称为软可达(softly-reachable)对象. 说明 垃圾回收器会在内存不足,经过一次垃圾回收 ...

  2. 你不可不知的Java引用类型之——ReferenceQueue源码详解

    定义 ReferenceQueue是引用队列,用于存放待回收的引用对象. 说明 对于软引用.弱引用和虚引用,如果我们希望当一个对象被垃圾回收器回收时能得到通知,进行额外的处理,这时候就需要使用到引用队 ...

  3. 你不可不知的Java引用类型之——虚引用

    定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...

  4. 你不可不知的Java引用类型之——弱引用

    定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱 ...

  5. 你不可不知的Java引用类型之——软引用

    定义 软引用是使用SoftReference创建的引用,强度弱于强引用,被其引用的对象在内存不足的时候会被回收,不会产生内存溢出. 说明 软引用,顾名思义就是比较"软"一点的引用. ...

  6. 你不可不知的Java引用类型之——强引用

    定义 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryError)也不会回收它. 说明 不要被这个强字吓到,以为这个引用就很厉害,其实强引用就是程序 ...

  7. 你不可不知的Java引用类型之——Reference源码解析

    定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...

  8. 你不可不知的Java引用类型之——PhantomReference源码详解

    定义 PhantomReference是虚引用,该引用不会影响不会影响对象的生命周期,也无法从虚引用中获取对象实例. 说明 源码介绍部分其实也没多大内容,主要内容都在前面介绍中说完了.PhantomR ...

  9. 你不可不知的Java引用类型之——WeakReference源码详解

    定义 WeakReference是弱引用,该引用不会影响垃圾回收器对对象的回收,不会影响对象的生命周期. 说明 当虚拟机在某个时间点决定要回收一个弱可达(weakly-reachable)对象时,会自 ...

随机推荐

  1. 召回率,精确率,mAP如何计算

    首先用训练好的模型得到所有测试样本的confidence  score,每一类(如car)的confidence   score保存到一个文件中(如comp1_cls_test_car.txt).假设 ...

  2. slf4j日志门面担当

    一.简介 slf4j主要是为了给Java日志访问提供一个标准.规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等.当然slf4j自己也提供了功能 ...

  3. 五款实用免费的Python机器学习集成开发环境(5 free Python IDE for Machine Learning)(图文详解)

    前言 集成开发环境(IDE)是提供给程序员和开发者的一种基本应用,用来编写和测试软件.一般而言,IDE 由一个编辑器,一个编译器(或称之为解释器),和一个调试器组成,通常能够通过 GUI(图形界面)来 ...

  4. Python数据可视化的四种简易方法

    摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据, ...

  5. PHP中对象的本质

    PHP中的面向对象 先看PHP源码中对变量的定义 #zend/zend.h typedef union_zvalue_value { long lval;/* long value */ double ...

  6. mysql年初至今聚合

    年初至今聚合和滑动聚合类似,不同的地方仅在于统计的仅为当前一年的聚合.唯一的区别体现在下限的开始位置上.在年初至今的问题中,下限为该年的第一天,而滑动聚合的下限为N个月的第一天.因此,年初至今的问题的 ...

  7. https://finance.sina.com.cn/realstock/company/sh600522/nc.shtml

    https://finance.sina.com.cn/realstock/company/sh600522/nc.shtml http://hq.sinajs.cn/list=sh601006

  8. linux平均负载的理解及原因排查

    当系统响应缓慢时,一般会用top或uptime命令查看系统负载是否过高. 例如输入uptime命令显示如下图,其中23:47:19表示现在的时间,up 260 days,14:39表示系统运行了多久, ...

  9. JAVA课程设计——一个简单的教务人事管理系统

    大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...

  10. SpringMVC注解,访问404,没有进入到controller

    很可能是.xml文件没有加载上:可参考http://www.cnblogs.com/mmzs/p/8757709.html