动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!

Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧:

1、Java中有哪几种引用?它们的含义和区别是什么?

从JDK1.2开始,Java中的引用类型分为四种,分别是:

①强引用(StrongReference)

②软引用(SoftRefernce)

③弱引用(WeakReference)

④虚引用(PhantomReference)

强引用-StrongReference

这种引用是平时开发中最常用的,例如Stringstrong=newString("StrongReference"),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。

软引用-SoftReference

如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。

ReferenceQueuereferenceQueue=newReferenceQueue();

SoftReferencesoftReference=newSoftReference<>(newBook(),referenceQueue);

Bookbook=softReference.get();

Referencereference=referenceQueue.poll();

当系统内存不足时,触发gc,这个Book就会被回收,reference将不为null。

弱引用-WeakReference

只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。

ReferenceQueuereferenceQueue=newReferenceQueue();

WeakReferenceweakReference=newWeakReference(newBook(),referenceQueue);

Bookbook=softReference.get();

System.gc();

//Runtime.getRuntime().gc();

Referencereference=referenceQueue.poll();

当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。

虚引用-PhantomReference

如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?

PhantomReferencephantomReference=newPhantomReference<>(newBook(),referenceQueue);

Bookbook=phantomReference.get();//此值为null

Referencereference=referenceQueue.poll();

弱引用什么时候被回收_Java引用类型有哪些相关推荐

  1. 弱引用什么时候被回收_Java基础 强引用、弱引用、软引用、虚引用

    前言 在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决 ...

  2. Java中的引用类型(强引用、弱引用)和垃圾回收

    Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...

  3. 弱引用什么时候被回收_ThreadLocal的内存泄露?什么原因?如何避免?

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  4. 的引用_java中的强引用,软引用,弱引用,虚引用

    一对象回收算法 Java在GC时判断对象是否存活有两种方式:第一种是引用计数方式,第二种是可达性分析算法: 引用计数器算法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用 ...

  5. 强引用、软引用、弱引用、虚引用以及垃圾回收机制

    一.回收对象判定算法 1.引用计数器算法 在堆中的每一个对象都有一个引用计数器,在任意位置引用了该对象,则该对象的引用计数器加一.这种垃圾回收机制比较传统,其缺点是无法判断两个对象循环依赖的情况,即A ...

  6. 【Java】强软弱虚四种引用,弱引用在ThreadLocal中的应用

    Java中的引用类型 - 强软虚弱 1.强引用(StrongReference) Object strongReference = new Object(); 只要有引用指向它,就不会被回收.当内存空 ...

  7. SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)

    Jerry前一篇文章 SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析 介绍了在ABAP里判断引用变量是否包含了一个有效引用的关键字:IS ...

  8. android软引用如何使用方法,Android的四种引用(强引用、弱引用、软引用、虚引用)...

    前言:满纸荒唐言,一把辛酸泪:都云作者痴,谁解其中味. 一.概述 早在JDK1.2就把对象引用分为四种级别,从而使程序能更灵活控制它的生命周期,级别由高到底依次为:强 > 软 > 弱 &g ...

  9. java弱引用弱点_终于有人把Java强、软、弱、虚四种引用知识点整理出来了

    强引用就是指在程序代码之中普遍存在的,指创建一个对象并把这个对象赋给一个引用变量,并没有像其它三种引用一样有一个就具体的类来描述.对于强引用对象,即使内存不足,JVM宁愿抛出OutOfMemoryEr ...

最新文章

  1. 记一次shell脚本推后台stopped的问题
  2. Brian 的 Perl 问题之万能指南
  3. 3proxy 使用指北
  4. Xamarin Essentials教程使用指南针Compass
  5. 常见的端口扫描类型及原理
  6. 人工智能:看似很美,却暗藏泡沫
  7. QML和C ++之间的数据类型转换
  8. FreeMarker语法指南
  9. 刘歧:让人生不留遗憾
  10. 隐马尔科夫模型及Viterbi算法的应用
  11. redis指定配置文件启动_Redis【简介amp;安装篇】
  12. pandas把'm8[ns]'类型转换为int类型进行运算
  13. 《数学之美》—统计语言模型
  14. 【学习备忘录】ele项目的环境配置
  15. vmware 虚拟机nat连接,局域网访问
  16. git clone 身份验证失败
  17. 后期维特根斯坦的语境观“:语言游戏”与“生活形式”
  18. Ubuntu 14.04 配置 Java SE jdk-7u55
  19. Codeforces Round #649 D. Ehab‘s Last Corollary 【思维,二分图,环】
  20. MATLAB模糊控制工具箱的使用及常见问题处理

热门文章

  1. Python的数据处理学习(三)
  2. sum() over() 函数的使用
  3. FORMS变量类型和消息提示
  4. C++:构造函数2——拷贝构造函数
  5. 再次理解STM32中的堆栈机制
  6. AB1601中如何实现比较精准NOP延时
  7. Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project 'drp2.8'. ja
  8. 近世代数--整环上的唯一分解问题--唯一分解整环中元素的标准分解式
  9. [Windows子系统] Ubuntu18.04安装及换源
  10. 设计模式--工厂方法(Factory Method)模式