JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

一、强引用

Java中默认声明的就是强引用

Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收

obj = null; //手动置null

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

二、软引用

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。

Object obj=new Object();

SoftReference sf=new SoftReference(obj);

obj=null;

三、弱引用

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。

Object obj=new Object();

WeakReference sf=new WeakReference(obj);

obj=null;

四、虚引用

一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象,虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

五,引用队列(ReferenceQueue)

引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。

与软引用、弱引用不同,虚引用必须和引用队列一起使用。

标签:obj,对象,Object,回收,引用,java,null,四种

来源: https://blog.csdn.net/airooter/article/details/112223077

java中四种常用的引用类型_java中四种引用类型相关推荐

  1. java中常用的关键字_java中的常用的关键字

    在java编程过程中,会经常写到一些关键字,但是对于他们应用的方式其实一直是模仿状态,并没有很实质的去了解,为什么要这么用,导致程序不能优化,或者出现了bug不明所以,因而再详细的去重温了一下各种了解 ...

  2. java中char是几个字节_Java中char占用几个字节

    在讨论这个问题之前,我们需要先区分unicode和UTF. unicode :统一的字符编号,仅仅提供字符与编号间映射.符号数量在不断增加,已超百万.详细:[https://zh.wikipedia. ...

  3. java语言中的数据是如何定义_java中的数据类型

    java中的数据类型 java语言的数据类型包括两种,基本数据类型和引用数据类型. 定义 基本数据类型:变量名指向具体的数值. 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值. ...

  4. java中gc是怎么工作的_java中的GC(gabage collection)如何工作

    1. "引用记数(reference counting)"是一种简单但速度很慢的垃圾回收技术.每个对象都含有一个引用记数器,当有引用连接至对象时,引用计数加1.当引用离开作用域或被 ...

  5. java购买同一件商品时加锁_java中CAS的ABA问题思考和整理(不看后悔系列)

    前言 听说经常面试被问到~今天同事说了这个问题,就查了一下这问题,觉得挺有意思的,就整理出来跟大家分享下.主要思考下面几个问题: 1.什么是CAS? 2.什么是CAS的ABA问题? 3.怎么解决这个问 ...

  6. java窗体分为左右两个面板_Java中怎么把一个窗体水平分为三部分呀?

    展开全部 用GridBagLayout吧,最精确的布局方法了.下面是我以前收藏的一篇文章你可以参考下,看上去很复杂,其实用32313133353236313431303231363533e78988e ...

  7. java交换两个变量的值_Java中交换两个整数变量的值

    需求 如下,我们定义了两个整数变量,并且分别进行了赋值,下面,我们需要实现的就是将x的值赋值给y,将y值赋值给x,实现x和y的值交换: int x = 100; int y = 200; 方法一:使用 ...

  8. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  9. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  10. java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...

    在网上看到很多人问关于"抽象类与接口的区别",因此本人想通过自己多年对JAVA开发的经验来总结一下抽象类与接口的区别以及分别在什么情况下使用它们. 在Java语言中, abstra ...

最新文章

  1. IDEA多行缩进快捷键
  2. 用python解算法谜题_编程的乐趣 用Python解算法谜题
  3. pytorch生成一个数组
  4. MSDN演练时发现的SqlServer2005数据库连接问题
  5. The proctime attribute ‘rowtime‘ must not replace an existing field.
  6. linux设备模型(8)_platform设备,Linux设备模型之platform总线
  7. CCF201503-2 数字排序
  8. 盘点物联网网络和设备安全的五个误解
  9. python非线性规划问题_python玄学建模(2):非线性规划
  10. 王爽《汇编语言》笔记(详细)
  11. 解决java.lang.NoClassDefFoundError: com.android.tools.fd.runtime.AppInfo
  12. php theexcerpt,WordPress:使用the_excerpt函数显示摘要信息
  13. tolua, luaframework环境搭建
  14. Google Indexing API 推送 (避免踩坑)
  15. Excel 神器 —— OpenPyXl
  16. 一些软件所有版本下载地址 (第一期)
  17. What is Java thread priority? 什么是java线程优先级
  18. Excel查找函数(VLOOKUP\SEARCH\FIND\MATCH)
  19. 第09篇 Compose-03 操作详解
  20. httpcancry抓包教程_HttpCanary抓包工具app下载

热门文章

  1. OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
  2. 【学习备份】ajax添加小例子
  3. c#中SqlHelper类的编写(三)
  4. HttpRequest获取文件流,HttpResponse输出文件流
  5. TensorFlow精选Github开源项目
  6. 2019年陕西省普通高校招生考生成绩统计表(文史、艺文)
  7. OJ系列之---IP与整数之间的转换
  8. 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据
  9. Android 画面设置模糊,如何在Android中模糊图像的某些部分?
  10. 马走日poj java超时_简单搜索poj 2243(水