Java引用类型分类以及详解

- Java引用类型概述

在JVM之中再好的算法,也敌不过一个好烂的程序员。一个程序要想写好有两点:按照开发标准进行、请写有用代码。
而对于垃圾的产生与回收的处理之中,要想进行更好的控制,就必须清楚的掌握Java中的四种引用方式。
强引用(Strong Reference):即使进行了多次的GC回收,即使JVM真的已经不够用了,即使JVM最终不得已抛出了OOM错误,那么该引用继续抢占;
软引用(Soft Reference):当内存空间不足时,可以回收此内存空间。如果充足则不回收,可以用其完成缓存的一些处理操作开发。
缓存:保证数据更快的操作(读取)。是不重要的数据。可以作为牺牲来释放空间。
弱引用(Weak Reference):不管内存是否紧张,只要一出现GC处理,则立即回收。
幽灵引用(Phantom Reference):和没有引用是一样的。
比如HashMap根据key取得值,设置key值为null和不设置key值的效果是一样的。

  • 强引用

强引用是Java默认支持的一种操作模式,也就是说在引用的处理其间,即使出现有GC,即使内存不足,该引用的数据也不会被回收。

范例:观察强引用:


这个流程就叫做强引用。在之前所编写的所有操作都属于强引用,而强引用只有全部的对象都断开连接之后,才可能称为垃圾空间,才有可能被回收。而即使有一个对象引用此空间,那么该对象也不会被回收。
在多线程状态下,即使产生多个引用对象,空间也不会被回收。


每个线程都会出现OOM
强引用并不是造成OOM的关键性因素,正常来讲,你每一个用户(线程)操作完成后,该对象都可以被很容易的进行回收,不必强制性进行回收。

  • 软引用
    软引用指的是当内存不足的时候才进行GC的空间释放,但是如果要想使用软引用必须单独使用特殊的处理类:
    java.lang.ref.SoftReference,该类的定义如下:


除了强引用,其它引用必须借助特殊类来完成。


软引用的类继承了Reference的引用父类。
这个类下有三个引用:

在软引用之中如果想要进行引用的处理操作,则可以使用如下的方法完成:

1.构造方法:public SoftReference(T reference);
2.取得引用的数据:public T get();

范例:观察软引用:

软引用与强引用相比,最大的特点在于:软引用中保存的内容如果在内存富裕的时候会继续保留,内存不足会作为第一批的丢弃者进行垃圾空间的释放。
在开发中,可以利用软引用可以实现高速缓存组件。
缓存处理好了,你的程序写的才能达到高性能的第一步

  • 弱引用
    弱引用最大的特点就是一旦发生了GC的处理操作,则保存的引用内容将立即释放。弱引用使用“WeakReference”类来完成。
    java.lang.ref.WeakReference

范例:弱引用处理

因为不执行GC,所以弱引用的对象并没有被释放。输出依然有值。

输出为null;
一旦执行了GC,那么就需要进行内存空间的释放,在类集里面有一个与弱引用功能相似的Map集合WeakHashMap,它属于弱引用的一个实现。

whm中存放的都是匿名对象。
个人觉得使用WeakHashMap最大的好处是可以用它保存一些共享数据,这些共享数据如果长时间不使用,可以将其清空。

  • 引用队列
    在之前使用软引用和弱引用的时候都会发现有这样一个构造方法:
    SoftReference:

    WeakReference:

    java.lang.ref包中一共五各类:一个父类,三个子类,另外一个就是引用队列。

引用队列:待被砍掉的对象的集合点
如果要清楚引用队列,则首先必须知道对象的引用的强度。如果说按照现在的理解来讲:强引用的强度大于软引用,软引用大于弱引用。


通过以上的图形分析可以发现,如果要想找到“对象5”,那么一共有两条对象的可及性的路径:

在以上给出的引用的路径上,1到5是最强引用,但是由于其本身存在一个软引用,所以对象5对于整个的程序就属于软可及对象。
在java里面,如果某一个对象不属于强引用,那么就需要有一个专门的机制来清除那些不具有存在价值的对象(强对象才有价值)
所以这个时候如果保存有太多的无价值对象就会造成内存泄漏,那么为专门提供有一个引用队列,当某一个对象被垃圾回收后,则该对象会被保存到引用队列之中。

范例:观察引用队列的处理操作;

在发生GC内存清理之前,此时引用队列中为null;

此处必须断开强引用
执行完GC之后引用队列有内容。

引用队列里面保存的就是一个要准备被回收的对象的信息。

  • 幽灵引用(虚引用)
    幽灵引用指的是什么都不保存,但是又看起来像是保存了一样。
    这个的处理类java.lang.ref.PhantomReference。

范例:观察幽灵引用:
幽灵引用直接就把要保存的内容保存在了引用队列之中

需要发生引用但是又不需要引用占用空间的时候。—采用幽灵引用。

Java引用类型分类以及详解相关推荐

  1. Java 内存模型 JMM 详解

    转载自 Java 内存模型 JMM 详解 JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体 ...

  2. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  3. Java八大基本数据类型-详解

    Java八大基本数据类型-详解 3.5 八大基本数据类型 Java中的八大基本数据类型在我们学习Java编程中非常重要,可以说是Java编程的起步.这节会为大家非常细致地介绍如何使用这八大基本数据类型 ...

  4. Java过滤器Filter使用详解

    <div id="post_detail"> 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目 ...

  5. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 如果您看过<三分钟极速体验:Java版 ...

  6. Java 中IO流详解(附实例代码/面试题)

    Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...

  7. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  8. java -jar 和 -cp详解

    java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...

  9. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

最新文章

  1. csdn自带的在线编辑器如何让图片并排显示
  2. Flex 颜色对照表_16进制
  3. jQuery中的$el是什么意思
  4. 御剑情缘服务器维护,御剑情缘7月27日更新维护内容及活动详解介绍
  5. Apple Pay与银联的联姻,是战略,不是产品
  6. 网易云信集成视频教程(四):如何快速实现iOS登录登出?
  7. Python初识与简介【开篇】
  8. 为了简单起见,Arquillian Chameleon
  9. C语言学习及应用笔记之六:C语言extern关键字及其使用
  10. html item 左右滑动,拖动Html元素集合 Drag and Drop any item
  11. contos的apt-get安装
  12. 【Redis】Redis Bitmaps
  13. 6.1倒计时锁(Countdown Latches)
  14. Java进阶:SpringMVC中通过监听器将Spring上下文对象放置到servletContext中,方便其他地方使用
  15. 添加打印机计算机无法访问,Win7系统添加打印机提示Windows无法打开“添加打印机”的解决方法...
  16. Oracle 同比环比
  17. Git入门基础-Chivalrous-专题视频课程
  18. 微信企业号和企业微信消息发送区别
  19. 在 Leaflet 中合并使用谷歌中国卫星图和高德地图
  20. Java案例:因数平方和

热门文章

  1. php 分库分表例子,mysql分库分表实战及php代码操作完整实例
  2. Python中http请求方法库汇总
  3. 请问JS中new 一个对象发生了什么
  4. ArcMap DayDreamInGIS 数据处理工具(裁剪工具/字段修改/要素合并/属性筛选/空间连接)版本更新说明
  5. Python循环控制
  6. 游戏安全资讯精选 2018年第二期:游戏行业年度白皮书;手游外挂、直播答题安全风险解析,近30%外挂手游存在致命安全问题,八招应对短信验证码攻击...
  7. vue过滤器和侦听器和计算属性
  8. Adaptive AUTOSAR Technology Sharing(一)
  9. redis 清除缓存
  10. 移除设备和驱动器百度网盘图标