示例代码如下:

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;/*** @author chenjc* @since 2020-01-13*/
public class PhantomReferenceTest {public static void main(String[] args) throws InterruptedException {User user = new User(1, "debo");ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();// 建立User对象的虚引用PhantomReference<User> phantomReference = new PhantomReference<>(user, userReferenceQueue);// 去掉强引用user = null;System.out.println(phantomReference.get());// 手动触发GCSystem.gc();System.out.println("GC: " + phantomReference.get());Reference<? extends User> reference = userReferenceQueue.remove(1000);if (reference != null) {System.out.println("对象User被回收了");}}private static class User {private Integer id;private String name;public User(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}}
}

输出如下:

null
GC: null
对象User被回收了

可以发现,在GC之前调用phantomReference.get()也无法获得User对象,虚引用就和没有引用一样。那么虚引用存在的意义是什么呢?当GC准备回收对象时,如果发现该对象存在虚引用,就会在回收对象后,将这个虚引用加入引用队列,以通知应用程序对象回收情况,所以也可以将一些资源释放和记录操作放到虚引用中执行。

PhantomReference虚引用相关推荐

  1. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  2. java 静态内部类 弱引用_Java基础 强引用、弱引用、软引用、虚引用

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

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

    ---恢复内容开始--- java中,一个对象会一个引用变量引用该对像,这个是最常见的引用方式.以此同时,java.lang.ref包下提供了3个类,SoftReference.PhantomRefe ...

  4. JVM之强引用、软引用、弱引用、虚引用

    JVM之强引用.软引用.弱引用.虚引用 整体架构 强引用Reference 软引用SoftReference 弱引用WeakReference 软引用和弱引用的适用场景 WeakHashMap案例演示 ...

  5. 简单介绍强引用,软引用,弱引用,虚引用

    StrongReference 强引用是使用最普遍的引用,如果一个对象具有强引用,那么垃圾回收器绝不会回收它,如: Object obj = new Object(): // 强引用 当内存空间不足, ...

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

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

  7. Java引用类型——强引用、软引用、弱引用和虚引用

    Java执行GC判断对象是否存活有两种方式其中一种是引用计数. 引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1. 在JDK 1.2以前的版本中,若 ...

  8. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  9. java 对象引用 弱引用吗_Java对象的强引用、软引用、弱引用和虚引用 笔记

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 使用最普遍的引用.如果一个对象具有强 ...

  10. 强引用、弱引用、软引用和虚引用

    前言 Java执行GC判断对象是否存活有两种方式其中一种是引用计数. 引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1. 在JDK 1.2以前的版本 ...

最新文章

  1. 多进程多线程GDB调试 (转)
  2. stm32 bootloader跳转
  3. access mysql 同步,SQLServer2008 同步Access数据库
  4. 九章算术卷第二 粟米
  5. 正弦函数_傅里叶为什么会想到把函数展开为正弦波
  6. 简述hdfs工作原理_HDFS原理概念扫盲
  7. soopn用一张表更新另一张表_kettle教程之单表读取
  8. MATLAB如何输出高分辨率图片?
  9. 03 高等数学专题——多元函数微积分
  10. Rethinking Visual Geo-localization for Large-Scale Applications 论文阅读CosPlace
  11. python cad按范围裁剪
  12. 家用计算机常见故障及解决方式,计算机常见的五大故障及解决办法
  13. 微信朋友圈点赞测试用例
  14. 浅墨博客《Real Time Rendering 3rd》提炼总结 截取(一)
  15. 没有扫描仪如何用PS把照片处理成扫描文件
  16. 司凤阻止鸿蒙熔炉,《琉璃》大结局成喜剧,天帝向计都安利儿子司凤,嘴炮换三界安宁...
  17. 毕业后距离就这样慢慢拉开的
  18. mysql的英文文献_mysql数据库英文文献.doc
  19. 【转】FILE *fp fopen 参数
  20. 【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计

热门文章

  1. Neutron服务组件和Vxlan、Vtep隧道详解工作中的应用(一)
  2. OSS定制自定义response header
  3. 利用js书写正三角形
  4. 计算机知识太多了记不住,内容太多记不住?教你提高记忆力
  5. 最新仿720全景云系统/可生成小程序+带PC端和教程
  6. 佛说五百年的回眸才换来今生的擦肩而过
  7. 关于DEP(数据执行保护)的分析
  8. java跳转_java后端实现页面跳转的方法
  9. 帝国cms 自定义页面 php,帝国CMS增加自定义页面模板修改教程
  10. 玻璃材料封接工艺技术介绍-电连接器封装形式