Java中的强引用,软引用,弱引用,虚引用的作用介绍

目录
  • 1.强引用(StrongReference)
  • 2.软引用(SoftReference)
  • 3.弱引用(WeakReference)
  • 4.虚引用(PhantomReference)
  • 5.强引用>软引用>弱引用>虚引用

1.强引用( Strong Reference )

最普遍的引用:Object obj=new Object()
抛出OutOfMemoryError终止程序也不会回收具有强引用的对象
通过将对象设置为null来弱化引用,使其被回收

2.软引用( Soft Reference )

对象处在有用但非必须的状态
只有当内存空间不足时,GC会回收该引用的对象的内存
可以用来实现高速缓存

String str=new String( original: "abc"); //强引用
SoftReference<String> softRef=new SoftReference<String>(str);//软引用

3.弱引用( Weak Reference )

非必须的对象,比软引用更弱一些
GC时会被回
被回收的概率也不大,因为GC线程优先级比较低
适用于引用偶尔被使用且不影响垃圾收集的对象

string str=new String( original: "abc"y ;
weakReference<String> abcweakRef = new weakReference<String>(str);

4.虚引用( PhantomReference )

不会决定对象的生命周期
任何时候都可能被垃圾收集器回收
跟踪对象被垃圾收集器回收的活动,起哨兵作用必须和引用队
ReferenceQueue联合使用

String str=new String( original: "abc");
ReferenceQueue queue = new ReferenceQueue( ) ;
PhantomReference ref = new PhantomReference(str, queue);

5.强引用>软引用>弱引用>虚引用

到此这篇关于Java中的强引用,软引用,弱引用,虚引用的作用介绍的文章就介绍到这了,更多相关Java中的强引用,软引用,弱引用,虚引用的作用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中弱引用和软引用的区别以及虚引用和强引用介绍

    知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用.我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别.如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式.相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象.弱引用和软引用的特殊行为使得它们在某些情况下非常有用.例如:软引用可以很好的用来实现缓存,当JVM需要

  • 详解JAVA 强引用

    定义 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryError)也不会回收它. 说明 不要被这个强字吓到,以为这个引用就很厉害,其实强引用就是程序中使用的一般引用类型.举个简单的栗子: String s = new String("Hello Frank!"); 强可达 如果一个对象与GC Roots之间存在强引用,则称这个对象为强可达(strong reachable)对象. 当你声明一个变量并指向一个实例的时候,其实就是在创造一

  • Java中强引用,软引用,弱引用概念解析

    1.概念解释强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC 将对象的引用显示地置为null:o=null; // 帮助垃圾收集器回收此对象 举例ArrayList的实现源代码: &amp;lt;img src="https://pic2.zhimg.com/50/dd6f826c4e0c045f3701978f311636e1_hd.png" data-rawwidth="361" data-rawheight=&q

  • 详解Java对象的强、软、弱和虚引用+ReferenceQueue

    详解Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 二.软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回

  • Java中的强引用,软引用,弱引用,虚引用的作用介绍

    目录 1.强引用(StrongReference) 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 5.强引用>软引用>弱引用>虚引用 1.强引用( Strong Reference ) 最普遍的引用:Object obj=new Object()抛出OutOfMemoryError终止程序也不会回收具有强引用的对象通过将对象设置为null来弱化引用,使其被回收 2.软引用( Soft Reference

  • Java中四种引用类型详细介绍

    Java 四种引用类型 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,

  • Java中的引用和动态代理的实现详解

    我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的.但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础? 如果去看动态代理的源代码(java.lang.reflect.Proxy),会发现其原理很简单(真正二进制类文件的生成是在本地方法中完成,源代码中没有),但其中用到了一个缓冲类java.lang.reflect.WeakCache<ClassLoader,Class<?>[],Class<?>

  • 全面理解Java中的引用传递和值传递

    目录 1.基本类型和引用类型在内存中的保存 2.变量的基本类型和引用类型的区别 3.引用传递和值传递 4.结论 关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型的

  • 浅谈Java 中的引用类型

    Java 中的引用类型:强引用.软引用.弱引用和虚引用 强引用 如 Object object = new Object(),那 object 就是一个强引用,如果一个对象具有强引用,垃圾回收器就永远不会回收它. 软引用 软引用用来描述一些还有用但非必需的对象.在内存即将发生内存溢出之前,会把这些对象列进回收范围之中进行二次垃圾回收.如果这次回收还没有足够内存,才会发生内存溢出现象. 另:软引用可用来实现内存敏感的高速缓存. 弱引用 用来描述非必需的对象.被弱引用关联的对象只能存活到下一次垃圾收

  • java中的引用类型之强软弱虚详解

    前言 java中的引用类型共4种:强软弱虚,具体每种类型的特点和应用场景.记录下.本文是看了马士兵老师的视频后记录整理的.加深印象. 基本概念 1. 强引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 显式地设置M对象为null,或让其超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象 示例代

  • Java 中的 Unsafe 魔法类的作用大全

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资源.自主管理内存资源等,这些方法在提升Java运行效率.增强Java语言底层资源操作能力方面起到了很大的作用. 但是,这个类的作者不希望我们使用它,因为我们虽然我们获取到了对底层的控制权,但是也增大了风险,安全性正是Java相对于C++/C的优势.因为该类在sun.misc包下,默认是被BootstrapClassLoader加载的.如果我们在程序中去调用这个类的话,我们使用的类加载

  • Java中final修饰的方法是否可以被重写示例详解

    这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的.如果在子类中重写final修饰的方法,在编译阶段就会提示Error.但是回答的时候还是有点心虚的,因为final变量就可以用反射的方法进行修改,我也不太确定是否有类似的机制可以绕过编译器的限制.于是面试之后特地上网搜了下这个问题,这里简单记录一下. 首先说一下结论:没有办法能够做到重写一个final修饰的方法,但是有其他的方法可以接近在子类中重新实现final方法并在运行时的动态绑定的效果. 这里需要用到一个a

随机推荐