Java之对象引用实践

这篇具有很好参考价值的文章主要介绍了Java之对象引用实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能概述

  • 从JDK1.2版本开始,程序可以通过4种类型的对象的引用来管控对象的生命周期。这4种引用分别为,强引用、软引用、弱引用和虚引用。本文中针对各种引用做了相关测试,并做对应分析。

功能实践

场景1:弱引用、虚引用、软引用基本使用

用例代码
@Test
public void test_reference_v1() {
    ReferenceQueue<Ref> queue = new ReferenceQueue<>();

    // 创建一个弱引用(指定引用的对象,以及引用对象要注册的队列)
    WeakReference<Ref> weak = new WeakReference<>(new Ref("Weak"), queue);
    // 创建一个虚引用
    PhantomReference<Ref> phantom = new PhantomReference<>(new Ref("Phantom"), queue);
    // 创建一个软引用
    SoftReference<Ref> soft = new SoftReference<>(new Ref("Soft"), queue);

    System.out.println("引用内容:");
    System.out.println(weak.get());
    System.out.println(phantom.get()); //看源码,phantom.get()始终返回null
    System.out.println(soft.get());

    System.out.println("被回收的引用:");
    for (Reference r = null; (r = queue.poll()) != null;) {
        System.out.println(r);
    }
}


class Ref {
    Object v;

    Ref(Object v) {
        this.v = v;
    }

    public String toString() {
        return this.v.toString();
    }
}
运行结果
引用内容:
Weak
null
Soft
被回收的引用:
结果分析
  • 弱引用对象和软引用对象都是可达的,但是虚引用对象不可点,phantom.get()调用时总是为null
  • 创建弱引用、软引用、虚引用时,需要执行引用的的对象、引用对象注册的队列,如:new WeakReference<>(new Ref(“Weak”), queue)

场景2:GC垃圾回收时,对象引用的行为

用例代码
@Test
public void test_reference_v2() {
ReferenceQueue<Ref> queue = new ReferenceQueue<>();

WeakReference<Ref> weak = new WeakReference<>(new Ref("WeakV2"), queue); //注册:此处的Ref对象在外部没有任何引用,所以在某个时间点,GC应当回收这个对象
PhantomReference<Ref> phantom = new PhantomReference<>(new Ref("PhantomV2"), queue);
SoftReference<Ref> soft = new SoftReference<>(new Ref("SoftV2"), queue);

System.out.println("引用内容V2:");
System.out.println(weak.get());
System.out.println(phantom.get()); //看源码,phantom.get()始终返回null
System.out.println(soft.get());

System.gc();
try {
        Thread.sleep(100); //给GC留点时间,保证GC执行完成
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
}

System.out.println("被回收的引用V2:");
for (Reference r = null; (r = queue.poll()) != null; ) {
    System.out.println(r);
}
运行结果
引用内容V2:
WeakV2
null
SoftV2
被回收的引用V2:
java.lang.ref.WeakReference@1b701da1
java.lang.ref.PhantomReference@726f3b58
结果分析
  • 弱引用和虚引用都会回收了,软引用要在接近OOM异常时回收

场景3:GC垃圾回收时,关联强引用

用例代码
@Test
public void test_reference_v3() {
    ReferenceQueue<Ref> queue = new ReferenceQueue<>();

    Ref wr = new Ref("Hard"); //强引用
    WeakReference<Ref> weak = new WeakReference<>(wr, queue); //引用的对象wr是强引用
    PhantomReference<Ref> phantom = new PhantomReference<>(wr, queue);
    SoftReference<Ref> soft = new SoftReference<>(new Ref("Soft"), queue);

    System.out.println("引用内容V3:");
    System.out.println(weak.get());
    System.out.println(phantom.get());
    System.out.println(soft.get());

    System.gc();
    try {
        Thread.sleep(100); //给GC留点时间,保证GC执行完成
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    System.out.println("被回收的引用V3:");
    for (Reference r = null; (r = queue.poll()) != null; ) {
        System.out.println(r);
    }
}
运行结果
引用内容V3:
Hard
null
Soft
被回收的引用V3:
结果分析
  • 弱引用、虚引用在创建时,若关联了强引用,在强引用可达时不会被回收
  • 在强引用置为null,如wr=null,表明强引用可被回收,此时关联的弱引用、虚引用都可被回收

功能总结

  • 多个引用说明:
    • a)HardReference:强引用(注:没有这个类,只是形象说明),类似String str = new String()建立起来的引用,都是强引用。在str指向另一个对象或null之前都不会被GC回收(指向另一个对象,或str=null才会被GC回收)
    • b)WeakReference:弱引用,当GC要求回收对象时,不会阻止对象被回收,即使有弱引用存在
    • c)SoftReference:软引用,当GC要求回收对象时,也不会阻止对象被回收,但回收过程会有延迟,必须要等到JVM heap内存不够用,接近产生OutOfMemory错误时,才会被回收
    • d)PhantomReference:虚引用,这种类型的引用比较特别,在大多数时间里,无法通过它拿到其引用的对象(即phantom.get()总是为null),但是,在这个对象消失的时候,该引用还是会进入ReferenceQueue队列中的

文章来源地址https://www.toymoban.com/news/detail-679885.html

到了这里,关于Java之对象引用实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月08日
    浏览(44)
  • JAVA基础 - 强引用、弱引用、软引用、虚引用

    Java 执行  GC(垃圾回收) 判断对象是否 存活 有两种方式,分别是 引用计数法 和 引用链法(可达性分析法) 。 引用计数: Java堆中给每个对象都有一个引用计数器,每当某个对象在其它地方被引用时,该对象的计数器 +1;引用失效则 -1; JDK 1.2 版本开始,对象的引用被划分为 

    2023年04月08日
    浏览(36)
  • Java 四种引用类型(强引用、软引用、弱引用、虚引用)

    在 Java 中,基本类型和引用类型是两种不同的数据类型 基本类型直接表示数值、字符或布尔值,直接将值存储在内存,包括 byte、short、int 、long、float 、double、char、boolean 引用类似 C 语言中的指针,在内存中存储的是对象的引用而不是对象本身,通过这个引用可以操作对象

    2024年02月05日
    浏览(53)
  • 【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。 方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式 。它允许将方法本身作为一个对象传递或存储,并

    2024年02月16日
    浏览(40)
  • 【Java 基础篇】Java方法引用详解

    Java方法引用是Java 8引入的一项重要特性,它提供了一种简洁、可读性高的方式来直接引用已经存在的方法。方法引用使得代码更加简洁、易懂,同时提高了代码的可维护性和重用性。本文将详细介绍Java方法引用的概念、语法和使用方法,并提供一些示例代码。 方法引用是一

    2024年02月12日
    浏览(35)
  • 【Java 干货教程】Java方法引用详解

    导言 Java方法引用是Java 8引入的一项重要特性,它提供了一种简洁、可读性高的方式来直接引用已经存在的方法。方法引用使得代码更加简洁、易懂,同时提高了代码的可维护性和重用性。本文将详细介绍Java方法引用的概念、语法和使用方法,并提供一些示例代码。 方法引用

    2024年02月01日
    浏览(35)
  • Java8函数式接口, 方法引用, 构造器引用, 数组引用

    只包含一个抽象方法的接口,称为函数式接口。 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明 我们可以在一个接口上使用 @Functionallnterface 注解,这样做可以检查它是

    2024年02月05日
    浏览(56)
  • Java中的四种引用:强、软、弱、虚引用

    引用在实际中基本使用的都是强引用,垃圾回收器判断对象是否存在可用的算法: 引用计数器算法,可达性分析算法 , 引用计数器算法 :在对象中添加一个引用计数器,每当对象被引用时,计数器加1,反正计数器减去1,当计数器为0,则不存在引用,垃圾回收的时候就可以回

    2024年02月11日
    浏览(47)
  • Java中的各种引用类型以及部分引用的相关例子

    在Java中,引用类型主要有四种,分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些类型通常与垃圾回收机制有关,用来描述对象的生命周期和可达性。下面详细介绍每一种引用类型: 强引用 (Strong Reference) 强

    2024年04月13日
    浏览(41)
  • Java 四大引用类型

    GC 回收的优先级上 : 强引用 - 软引用 - 弱引用 - 虚引用 当内存不足, JVM 开始进行 gc 时,对于强引用的对象不会进行回收,即使出现了 OOM 也不会回收。因此,强引用是造成内存泄露的主要原因。 当进行 GC 时,如果内存还足够,则不进行回收该对象,若内存不够,则回收该

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包