Java基础之引用相关知识总结

 更新时间:2021年05月21日 14:14:33   作者:香菜聊游戏  
今天聊聊Java的引用,大多数时候我们说引用都是强引用,只有在对象不使用的情况下才会释放内存,其实Java 内存有四种不同的引用.一起看看吧,,需要的朋友可以参考下

一、引用的定义

在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。

二、问题

当描述这样的一类对象:当内存空间还足够时,则能保留在内存之中,如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。此时的引用就显得过于狭隘。因此在JDK 1.2之后,Java堆引用的概念进行了扩充。

三、引用的分类

回收时机
强引用 Strong Reference 类似Object obj = new Object() 只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象
软引用 Soft Reference 描述一些还有用但并非必须的对象 在系统将要发生内存溢出的异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常
弱引用 Weak Reference 用来描述非必须对象,强度比软引用更弱。被弱引用关联的对象只能生存到下一次垃圾收集发生之前 当垃圾收集器工作时,无论当前内存是否足够,都会回收掉纸杯弱引用关联的对象
虚引用 Phantom Reference 又称为幽灵引用或幻影引用,最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。 为一个对象设置虚引用关联的卫衣目的就是能在这个对象被收集器回收时收到一个系统通知

四、应用场景

1.强引用

最常用的,应用场景最多,everywhere

2.软引用

只有将要发生OOM的时候,才会主动回收,应用在一些内存限制比较大的应用内,避免发生OOM。

3.弱引用

不管是young gc 还是 full gc 都会回收弱引用的对象。当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候你就是用弱引用。

4.虚引用

在回收时可以检测到,虚引用主要用来跟踪对象被垃圾回收器回收的活动。

五、源码

package org.pdool.ref;
​
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
​
public class ReferenceTest {
​
    private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>();
​
    public static void checkQueue() {
        Reference<? extends VeryBig> ref = null;
        while ((ref = rq.poll()) != null) {
            //   只留有引用,没有对象
            System.out.println("In queue: "    + ((VeryBigWeakReference) (ref)).id);
        }
    }
​
    public static void main(String args[]) {
        int size = 3;
        LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<WeakReference<VeryBig>>();
        for (int i = 0; i < size; i++) {
            weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));
            System.out.println("Just created weak: " + weakList.getLast());
        }
​
        System.gc();
        try {
            // 暂停6s,让上面的垃圾回收线程运行完成
            Thread.currentThread().sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        checkQueue();
    }
}
​
class VeryBig {
    public String id;
    // 占用空间,让线程进行回收
    byte[] b = new byte[2 * 1024];
​
    public VeryBig(String id) {
        this.id = id;
    }
​
    protected void finalize() {
        System.out.println("Finalizing VeryBig " + id);
    }
}
​
class VeryBigWeakReference extends WeakReference<VeryBig> {
    public String id;
​
    public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) {
        super(big, rq);
        this.id = big.id;
    }
​
    protected void finalize() {
        System.out.println("Finalizing VeryBigWeakReference " + id);
    }
}

六、总结

虽然Java提供了这么多引用,但是在平常的业务开发中基本上只要强引用就可以了,整体来说上面除了强引用其他三个引用都是和内存相关的,只要在开发中不要内存泄漏,基本上内存不会出现问题

到此这篇关于Java基础之引用相关知识总结的文章就介绍到这了,更多相关Java引用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring注解之@Lazy注解使用解析

    Spring注解之@Lazy注解使用解析

    这篇文章主要介绍了Spring注解之@Lazy注解使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Jenkins+Docker+Gitee+SpringBoot自动化部署

    Jenkins+Docker+Gitee+SpringBoot自动化部署

    本文主要介绍了Jenkins+Docker+Gitee+SpringBoot自动化部署,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


    2022-03-03
  • MybatisPlus BaseMapper 实现对数据库增删改查源码

    MybatisPlus BaseMapper 实现对数据库增删改查源码

    MybatisPlus 是一款在 Mybatis 基础上进行的增强 orm 框架,可以实现不写 sql 就完成数据库相关的操作,这篇文章主要介绍了MybatisPlus BaseMapper 实现对数据库增删改查源码解析,需要的朋友可以参考下
    2023-01-01
  • mybatis教程之增删改查_动力节点Java学院整理

    mybatis教程之增删改查_动力节点Java学院整理

    这篇文章主要介绍了mybatis教程之增删改查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • MongoDB中ObjectId的误区及引起的一系列问题

    MongoDB中ObjectId的误区及引起的一系列问题

    这篇文章主要介绍了MongoDB中ObjectId的误区及引起的一系列问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • java代码实现斗地主发牌功能

    java代码实现斗地主发牌功能

    这篇文章主要介绍了java实现斗地主发牌功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 关于jar包增量更新分析

    关于jar包增量更新分析

    这篇文章主要介绍了关于jar包增量更新分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 解决Java 结构化数据处理开源库 SPL的问题

    解决Java 结构化数据处理开源库 SPL的问题

    这篇文章主要介绍了Java 结构化数据处理开源库 SPL的问题,Scala提供了较丰富的结构化数据计算函数,但编译型语言的特点,也使它不能成为理想的结构化数据计算类库,对此内容感兴趣的朋友一起看看吧
    2022-03-03
  • Java实现批量向mysql写入数据的方法

    Java实现批量向mysql写入数据的方法

    这篇文章主要介绍了Java实现批量向mysql写入数据的方法,涉及java基于JDBC连接mysql数据库及写入数据的相关操作技巧,非常简单实用,需要的朋友可以参考下
    2017-12-12
  • java常用数据流应用实例解析

    java常用数据流应用实例解析

    这篇文章主要介绍了java常用数据流应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论