我们知道在Java中除了基础的数据类型以外,其它的都为引用类型。 而Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、幻象引用

正常情况下我们平时基本上我们只用到强引用类型,而其他的引用类型我们也就在面试中,或者平日阅读类库或其他框架源码的时候才能见到。

1.强引用

我们平日里面的用到的new了一个对象就是强引用,例如 Object obj = new Object();当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止也不愿意回收具有强引用的存活着的对象

记住是存活着,不可能是你new一个对象就永远不会被GC回收。当一个普通对象没有其他引用关系,只要超过了引用的作用域或者显示的将引用赋值为null时,你的对象就表明不是存活着,这样就会可以被GC回收了。当然回收的时间是不一定的具体得看GC回收策略。

2.软引用

软引用的生命周期比强引用短一些。软引用是通过SoftReference类实现的。

Object obj = new Object();
SoftReference softObj = new SoftReference(obj);
obj = null; //去除强引用
复制代码

这样就是一个简单的软引用使用方法。通过get()方法获取对象。当JVM认为内存空间不足时,就回去试图回收软引用指向的对象,也就是说在JVM抛出OutOfMemoryError之前,会去清理软引用对象。软引用可以与引用队列(ReferenceQueue)联合使用。

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
SoftReference softObj = new SoftReference(obj,queue);
obj = null; //去除强引用
复制代码

softObj软引用的obj被GC回收之后,softObj 对象就会被塞到queue中,之后我们可以通过这个队列的poll()来检查你关心的对象是否被回收了,如果队列为空,就返回一个null。反之就返回软引用对象也就是softObj

软引用一般用来实现内存敏感的缓存,如果有空闲内存就可以保留缓存,当内存不足时就清理掉,这样就保证使用缓存的同时不会耗尽内存。例如图片缓存框架中缓存图片就是通过软引用的。

3.弱引用

弱引用是通过WeakReference类实现的,它的生命周期比软引用还要短,也是通过get()方法获取对象。

 Object obj = new Object();WeakReference<Object> weakObj = new WeakReference<Object>(obj);obj = null; //去除强引用
复制代码

在GC的时候,不管内存空间足不足都会回收这个对象,同样也可以配合ReferenceQueue 使用,也同样适用于内存敏感的缓存。ThreadLocal中的key就用到了弱引用。

4.幻象引用

也称虚引用,是通过PhantomReference类实现的。任何时候可能被GC回收,就像没有引用一样。

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> phantomObj = new PhantomReference<Object>(obj , queue);
obj = null; //去除强引用
复制代码

无法通过虚引用访问对象的任何属性或者函数。那就要问了要它有什么用?虚引用仅仅只是提供了一种确保对象被finalize以后来做某些事情的机制。比如说这个对象被回收之后发一个系统通知啊啥的。虚引用是必须配合ReferenceQueue 使用的,具体使用方法和上面提到软引用的一样。主要用来跟踪对象被垃圾回收的活动。


如有错误欢迎指正!

个人公众号:yes的练级攻略

有相关面试进阶(分布式、性能调优、经典书籍pdf)资料等待领取

面试官:说说Java对象的四种引用方式相关推荐

  1. Java对象的四种引用方式

    本文会按照以下思路进行: (1)Java的四种对象引用的基本概念 (2)四种对象引用的差异对比 (3)对象可及性的判断以及与垃圾回收机制的关系 (4)引用队列ReferenceQueue的介绍 (5) ...

  2. Java对象的四种引用

    前言 在JDK1.2之前,创建的对象只有在处于可触及(reachable)的状态下,才能被程序使用.也就是说,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.垃圾回收器一旦发现这些无用对象, ...

  3. Java中的四种引用方式的区别

    强引用.软引用.弱引用.虚引用的概念 ps:我更新了.....我真的更新了.....因为博客园不支持MarkDown,而且取了一个很low的用户名,所以不用了..... 强引用(StrongRefer ...

  4. JAVA四种引用方式

    JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...

  5. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  6. Java的四种引用方式

    Java的四种引用方式 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括   强引用,软引用,弱引用,虚引用 Jav ...

  7. Java 内部类的四种实现方式

    Java 内部类的四种实现方式 前言 今天的话我将为大家介绍Java的四种内部类,他们分别是普通内部类,静态内部类,局部内部类,匿名内部类. 提示:以下是本篇文章正文内容,下面案例可供参考 一.内部类 ...

  8. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

  9. vs 编译器的堆空间不足_原创|面试官:Java对象一定分配在堆上吗?

    最近在看 Java 虚拟机方面的资料,以备工作中的不时之需.首先我先抛出一个我自己想的面试题,然后再引出后面要介绍的知识点如逃逸分析.标量替换.栈上分配等知识点 面试题 Java 对象一定分配在堆上吗 ...

最新文章

  1. java线程 教程_Java多线程系列教程
  2. 雷人的调查:荷兰女性的安全意识
  3. CSS基础(part22)--2D转换
  4. Python提取docx文档中例题、插图、表格清单
  5. 如何确定C语言中数组的大小?
  6. python自动化办公模块有哪些-python如何实现自动化办公?
  7. Linux使用jstat命令查看jvm的GC情况(转)
  8. navicat循环执行上下两行相减sql语句_十步完全理解SQL,小白也可以做到!
  9. udp超过mtu长度 linux,TCP UDP 数据包长度(MSS)总结
  10. 《程序人生》2020无畏年少青春,迎风潇洒前行,杭漂程序员2019的心路历程,披荆斩棘终雨过天晴
  11. 阿根廷公布世界杯23人名单以及点评
  12. 算法注册机编写扫盲---第五课
  13. OpenStreetMap 2020年全球数据导入benchmark
  14. 数据中台系统架构设计
  15. libjpeg与turbo libjpeg的使用
  16. 读书笔记:redis开发与运维 基础篇
  17. verilog基础——always、initial
  18. 中国汽车工业发展现状分析,广汽销量仍然位居首位「图」
  19. 《商业模式新生代(个人篇)》书摘
  20. 写给我身体里的大毛怪

热门文章

  1. ASP.NET中将数据输出到Excel
  2. 聊聊Elasticsearch RestClient的RequestLogger
  3. oralce的function处理考勤时间节点以及计算工作时间
  4. 微软面试题:写程序找出二叉树的深度
  5. 3款强大的BootStrap的可视化制作工具推荐
  6. 几个容易混淆的对齐概念
  7. UIMenuController,UIPasteboard:复制,粘贴详细解释
  8. 开发环境eclipse for Mac 下的常用快捷键汇总(基本参照Win系,将Ctrl换为Command)
  9. 动手制作Dos、WinPE、Slax Linux|winpe+dos+Mini Linux U盘启动盘
  10. 推荐一个css帮助手册的版本 同时提供chm和在线