一对象回收算法

JavaGC时判断对象是否存活有两种方式;第一种是引用计数方式,第二种是可达性分析算法

引用计数器算法

在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可用对象

额外占用空间,高效;

可达性分析算法

从gc roots 往下搜索,走过的路径称为引用链,如果引用链断开说明对象不可达标记为可回收对象;如果引用链连续说明此对象可达标记为不可回收对象。如图所示,object4,object5,object7都是被标记为可回收对象。

jdk1.2版本之前 如果一个对象没有被引用,则无法使用这个对象;jdk1.2版本之后对象被分为4个引用级别,由高到低依次为:强引用软引用弱引用虚引用;开发人员可以利用对象的引用级别灵活控制对象的生命周期。

二强引用(StrongReference)

强引用是指引用赋值,即Objecto bj = new Object()。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。

如下方式都是强引用

Object obj = new Object();
String str = "zszxz";

如果一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收对象,故通常如果对象不用的时候就需要手动赋值为 null, 方便垃圾回收器回收

示例

String str = null;

当然 通常对象不会手动赋值为null, 只有比较大的对象集合时就需要手动赋值,比如 ArrayList 里面的 clear() 方法。

public void clear() {modCount++;
​// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;
​size = 0;}

注:养成手动释放内存能提示程序性能

三软引用(SoftReference)

软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常;

源码:

    // 时间戳,右垃圾回收器更新static private long clock;
​// 时间戳,通过get方法调用更新,选择软引用时将被清除,VM可以使用这个字段,并非必须private long timestamp;
​
​public SoftReference(T referent) {// 构造器,给对象注入一个软引用super(referent);this.timestamp = clock;}
​// 给对象注入一个软引用,并且注入队列public SoftReference(T referent, ReferenceQueue<? super T> q) {super(referent, q);this.timestamp = clock;}
​// 返回对象的引用,如果引用对象已经被清除或者垃圾回收,则返回Nullpublic T get() {T o = super.get();if (o != null && this.timestamp != clock)this.timestamp = clock;return o;}

如下方式,即使发生gc,只要内存没有溢出就不会回收软引用

public static void main(String[] args) throws InterruptedException {// 给对象注入软引用SoftReference<String> reference = new SoftReference<>(new String("zszxz"));// zszxzSystem.out.println(reference.get());// 调用GCSystem.gc();TimeUnit.SECONDS.sleep(5);// zszxzSystem.out.println(reference.get());}

适用于缓存场景

四弱引用(WeakReference)

当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉被弱引用关联的对象;

源码:

public class WeakReference<T> extends Reference<T> {// 给对象注入弱引用public WeakReference(T referent) {super(referent);}
​// 给对象注入一个弱引用并注入引用队列public WeakReference(T referent, ReferenceQueue<? super T> q) {super(referent, q);}
​
}

如下方式,一旦GC调用则会回收对象。

 public static void main(String[] args) throws InterruptedException {WeakReference<String> weakReference = new WeakReference<>(new String("zszxz"));// zszxzSystem.out.println(weakReference.get());// 调用GCSystem.gc();TimeUnit.SECONDS.sleep(5);// zszxzSystem.out.println(weakReference.get());}

五虚引用(PhantomReference)

为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知,除此之外没有任何作用,不决定对象的生命周期;

源码

public class PhantomReference<T> extends Reference<T> {​// 获得引用public T get() {return null;}
​// 创建虚引用public PhantomReference(T referent, ReferenceQueue<? super T> q) {super(referent, q);}
​
}

如下示例,即使不调用GC,引用也是为null。

public static void main(String[] args) throws InterruptedException {// 引用队列ReferenceQueue queue = new ReferenceQueue();PhantomReference reference = new PhantomReference(new String("zszxz"),queue);// nullSystem.out.println(reference.get());}

六总结

  • 强引用:从来不会被回收
  • 软引用:当内存不足时会被回收
  • 弱引用:正常垃圾回收时回收
  • 虚引用:任何时刻都会被垃圾回收器回收

关注公众号:知识追寻者 获取原创PDF,面试题

的引用_java中的强引用,软引用,弱引用,虚引用相关推荐

  1. 软引用和弱引用的区别_强、软、弱、虚引用的区别和使用

    原文阅读: 强.软.弱.虚引用的区别和使用​mp.weixin.qq.com Java提供了四种级别的应用类型:强引用.软引用.弱引用及虚引用.那么这四种引用类型有什么区别呢? 首先我们通过一张图来看 ...

  2. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  3. 对象的强、软、弱和虚引用

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  4. Java:对象的强、软、弱和虚引用

    见:http://zhangjunhd.blog.51cto.com/113473/53092 maven/Java/web/bootstrap/dataTable/app开发QQ群:56686262 ...

  5. java-基础-强、软、弱、虚引用

    Java的四种引用,强弱软虚,用到的场景. JDK1.2之前只有强引用,其他几种引用都是在JDK1.2之后引入的. 强引用(Strong Reference) 最常用的引用类型,如Object obj ...

  6. jvm系列 (四) ---强、软、弱、虚引用

    java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...

  7. JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)

    一.Java 引用概述 Java 中出现四种引用是为了更加灵活地管理对象的生命周期,以便在不同场景下灵活地处理对象的回收问题.不同类型的引用在垃圾回收时的处理方式不同,可以用来实现不同的垃圾回收策略. ...

  8. Java对象引用四个级别(强、软、弱、虚)

    转载自 Java对象引用四个级别(强.软.弱.虚) 最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这 ...

  9. 【Java】Java对象引用四个级别(强、软、弱、虚)

    文章目录 1.概述 强引用(StrongReference) 软引用(SoftReference) 弱引用(WeakReference) 虚引用(PhantomReference) 2. 扩展阅读 1 ...

最新文章

  1. LabVIEW实现CRC校验
  2. 程序员如何解决工作中的技术问题?
  3. fitEllipse函数
  4. MongoEngine MongoDB 的 ORM 库
  5. linux安全检测及防护,Linux安全检测及防护-单选题.doc
  6. mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上
  7. 曲率多项式转换为直角坐标系
  8. java定时器与ThreadLocal编程陷阱
  9. Java中的锁---队列同步器
  10. 物联网的几大开源操作系统
  11. LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
  12. centos本地yum源配置
  13. 项目管理十大知识领域
  14. 为什么这么多学生讨厌数学(以及如何解决它)?
  15. 【记录一次服务器被攻击】-[附带解决方案]
  16. 半加器 全加器 Verilog描述
  17. mysql 在当前时间上加几小时
  18. pygame小游戏开发 - 冰雪英雄会
  19. 工业相机之常见参数|视觉硬件篇
  20. 【基础】Flink -- DataStream API

热门文章

  1. Spark _08窄依赖和宽依赖stage
  2. leetcode 229. Majority Element II | 229. 求众数 II(找出现次数超过n/k的元素)
  3. leetcode 121. 买卖股票的最佳时机
  4. HotSpot源码(二):Java与C语言对比
  5. 【PAT甲级 BigInteger运算】1024 Palindromic Number (25 分) Java 全部AC
  6. 巧用HashMap一行代码统计单词出现次数
  7. Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助
  8. Spring事务管理--嵌套事务详解
  9. VUE如何操作DOM
  10. E - Ignatius and the Princess IV