前言

Java执行 GC(垃圾回收)判断对象是否存活有两种方式,分别是引用计数法引用链法(可达性分析法)

引用计数:Java堆中给每个对象都有一个引用计数器,每当某个对象在其它地方被引用时,该对象的计数器 +1;引用失效则 -1;

JDK 1.2版本开始,对象的引用被划分为 4种级别,使程序能更加灵活地控制对象的生命周期。这 4种级别由高到低依次为:强引用软引用弱引用虚引用

正文

(一) 强引用(StrongReference)

在一个线程内,无须引用直接可以使用的对象,强引用不会被JVM清理。我们平时申明变量使用的就是强引用,普通系统99%以上都是强引 用,比如,String s="Hello World"。

Java中的引用,有点像 C++的指针。通过引用,可以对堆中的对象进行操作。在Java 程序中,最常见的引用类型是强引用,它也是默认的引用类型。例如:StringBuffer str=new StringBuffer(“Hello World”);
当在Java语言中使用new 操作符创建一个新的对象,并将其赋值给一个变量的时候,这个变量就成为指向该对象的一个强引用。而判断一个对象是否存活的标准为是否存在指向这个对象的引用。

强引用具备以下特点
(1)强引用可以直接访问目标对象。
(2)强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出Out Of Memory异常也不会回收强引用所指向的对象。
(3)强引用可能导致内存泄漏。

通常来说,应用程序内部的内存泄露两种情况。一种是虚拟机中存在程序无法使用的内存区域,另一种情况是程序中存在大量存活时间过长的对象。

(二) 软引用(SoftReference)

java中使用SoftRefence来表示软引用

软引用是除了强引用外最强的引用类型,我们可以通过java.lang.ref.SoftReference使用软引用。一个持有软引用的对象,它不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阙值时,才会去回收软引用的对象。只要有足够的内 存,软引用便可能在内存中存活相当长一段时间。通过软引用,垃圾回收器就可以在内存不足时释放软引用可达的对象所占的内存空间。保证程序正常工作。

通过一个软引用申明,JVM抛出OOM之前,清理所有的软引用对象。垃圾回收器某个时刻决定回收软可达的对象的时候,会清理软引用,并可选的把引用存放到一个引用队列(ReferenceQueue)。

(三) 弱引用(WeakReference)

java中使用WeakReference来表示弱引用。如果某个对象与弱引用关联,那么当JVM在进行垃圾回收时,无论内存是否充足,都会回收此类对象。

通过一个弱引用申明。类似弱引用,只不过 Java 虚拟机会尽量让软引用的存活时间长一些,迫不得已才清理。

(四) 虚引用(PhantomReference)

java中使用PhantomReference来表示虚引用。

通过一个虚引用申明。仅用来处理资源的清理问题,比Object里面的finalize机制更灵活。get方法返回的永远是null,Java虚拟机不负责清理虚引用,但是它会把虚引用放到引用队列里面。

虚引用的主要目的是在一个对象所占的内存被实际回收之前得到通知,从而可以进行一些相关的清理工作。弱引用之前的两种引用类型有很大的不同:首先虚引用在创建时必须提供一个引用队列作为参数;其次虚引用对象的get方法总是返回null,因此无法通过虚引用来获取被引用的对象。

代码

        //强引用String S = "强 引用 森";//软引用SoftReference<String> stringSoftReference = new SoftReference<>(new String("软 引用 仔"));System.out.println(stringSoftReference.get());System.gc();System.out.println(stringSoftReference.get());//弱引用WeakReference<String> str = new WeakReference<>("弱reference 森");System.out.println(str.get());System.gc();  //通知JVM进行内存回收System.out.println(str.get());//虚引用ReferenceQueue<Object> queue = new ReferenceQueue<>();PhantomReference<String> strs = new PhantomReference<>("虚引用 ", queue);System.out.println(strs.get());System.out.println(S);打印内容:
软 引用 仔
软 引用 仔
弱reference 森
null
null
强 引用 森

总结

Java中 4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用

垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象 Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。

表格说明如下:

引用类型 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时终止
软引用 当内存不足时 对象缓存 内存不足时终止
弱引用 正常垃圾回收时 对象缓存 垃圾回收后终止
虚引用 正常垃圾回收时 跟踪对象的垃圾回收 垃圾回收后终止

人无完人,接受指点与反驳,森!!仔

JAVA基础 - 强引用、弱引用、软引用、虚引用相关推荐

  1. android的四种对象引用级别:强、弱、软、虚引用

    android中的强引用,弱引用,软引用,虚引用.代表了android中的对象引用级别,也即代表了java的垃圾回收机制,看可以简单理解为内存释放. 1.强引用:强引用是使用最普遍的引用.如果一个对象 ...

  2. ThreadLocal之强、弱、软、虚引用

    1.ThreadLocal简介 ThreadLocal提供线程局部变量.这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的.独立初始化 ...

  3. Java 强、弱、软、虚,你属于哪一种?

    作者:CodeBear的园子 来源:www.cnblogs.com/CodeBear/p/12447554.html Java中的四种引用 Java中有四种引用类型:强引用.软引用.弱引用.虚引用. ...

  4. java弱_Java 强、弱、软、虚,你属于哪一种?

    Java技术栈 www.javastack.cn 打开网站看更多优质文章 作者:CodeBear的园子 来源:www.cnblogs.com/CodeBear/p/12447554.html Java ...

  5. java基础练习题(for,switch,while,基本数据类型和引用数据类型的联系)

    1.打印输出字符串"HelloWorld". /*1.打印输出字符串"HelloWorld". */ public class zuoye_01 {public ...

  6. JAVA基础知识学习全覆盖

    文章目录 一.JAVA基础知识 1.一些基本概念 1.Stringbuffer 2.局部变量成员变量 3.反射机制 4.protect 5.pow(x,y) 6.final ,finally,fina ...

  7. java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗

    目录 谈引用 强引用(Strong Reference)--不回收 强引用例子 软引用(Soft Reference)--内存不足即回收 弱引用(Weak Reference)--发现即回收 面试题: ...

  8. java 虚引用 作用_Java的强引用、弱引用、软引用和虚引用,以及用途

    Java种除了基本数据类型,其它数据类型都是引用的数据类型.而应用数据类型根据生命周期的长短又分为:强引用.弱引用.软引用和需引用(幻象引用),我们平时基本上只用到强引用类型,而其他的引用类型我们也就 ...

  9. 一文带你搞懂Java的四大引用:强引用,软引用,弱引用以及虚引用

    Java中的引用 强引用Reference Reference类以及继承派生的类. 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收. 这样定义的默 ...

最新文章

  1. vue+webpack热替换
  2. 12.dateformat常用格式
  3. String类的一些常见的获取方法(5)
  4. 解决github网站打开慢的问题
  5. c++删除字符串特殊符号
  6. 简易数字电路交通灯设计
  7. 小米8青春版解BL锁教程申请BootLoader解锁教程
  8. 弹出USB大容量存储设备时出问题 的解决方法
  9. Ubuntu Apt 如何使用清华源
  10. java 龟兔赛跑预测_Java实现 蓝桥杯VIP 基础练习 龟兔赛跑预测
  11. 新手云服务器系统,新手云服务器系统
  12. C语言之memcpy()函数
  13. 计算机找不到 bitlocker,win10中找不到bitlocker驱动器的解决方法介绍
  14. 基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证
  15. 1*1卷积核的作用(bottleneck的作用)
  16. c语言 算术平均滤波法_基本C语言滤波算法
  17. 腾讯ISUX:精益设计 “纸上谈兵”的说服力
  18. 一位25岁的董事长给大学生的18条忠告
  19. 《idea 骚操作》
  20. python童年_一行代码玩童年小游戏

热门文章

  1. 100Hz加压电光调Q 参数及使用方法
  2. 当代家庭教育杂志当代家庭教育杂志社当代家庭教育编辑部2022年第31期目录
  3. 高清音质媲美HIFI,双11高性价比低延迟蓝牙耳机推荐
  4. 5G 带来的万物互联,2020年,web前端工程师在未来发展的惊人表现!
  5. html如何做左侧导航条,如何使用HTMLCSS制作左侧滑动导航条
  6. CODE[VS] 2008 你已经爱我多久了
  7. My piano dream.....
  8. 海康威视前端视频插件百度云
  9. vue公众号项目中的橡皮筋效果
  10. 判断给定的点们是否共线