当前位置: 首页 > article >正文

java的弱引用、软引用和虚引用

Java中的弱引用、软引用和虚引用是用于解决内存泄漏问题的引用类型。它们具有不同的特性,可以在不同场景下使用。

1. *弱引用(WeakReference)

弱引用用于引用对象,但不影响对象的垃圾回收。当系统内存空间不足时,JVM会优先回收被弱引用引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,当被引用的对象被垃圾回收时,就会将弱引用对象加入到引用队列中。

示例代码:

import java.lang.ref.WeakReference;
import java.lang.ref.ReferenceQueue;

public class WeakReferenceExample {
    public static void main(String[] args) {
        String str = new String("Hello");
        ReferenceQueue<String> queue = new ReferenceQueue<>();
        WeakReference<String> weakRef = new WeakReference<>(str, queue);
        str = null; // 显式将强引用设置为null,使对象成为垃圾
        System.gc(); // 显式调用垃圾回收器
        try {
            // 如果弱引用对象被加入引用队列,说明被引用的对象已经被回收
            if (queue.remove(1000) != null) {
                System.out.println("The object has been garbage collected.");
            } else {
                System.out.println("The object is still alive.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2. 软引用(SoftReference)

软引用用于引用对象,只有当系统内存不足时,才会回收被软引用引用的对象。软引用同样可以和一个引用队列联合使用。软引用常用于实现内存敏感的缓存。

示例代码:

import java.lang.ref.SoftReference;
import java.lang.ref.ReferenceQueue;

public class SoftReferenceExample {
    static class HeavyObject {
        private byte[] spaceHolder = new byte[1024 * 10]; // 占用一定的内存空间
    }
    
    public static void main(String[] args) {
        HeavyObject heavyObj = new HeavyObject();
        ReferenceQueue<HeavyObject> queue = new ReferenceQueue<>();
        SoftReference<HeavyObject> softRef = new SoftReference<>(heavyObj, queue);
        heavyObj = null; // 显式将强引用设置为null,使对象成为垃圾
        // 在内存充足的情况下,对象不会被回收
        System.out.println("Is the object alive? " + (softRef.get() != null));
        // 模拟内存不足的情况,触发垃圾回收
        byte[] memoryFiller = new byte[1024 * 1024 * 100]; // 分配大量内存空间
        System.out.println("Is the object alive? " + (softRef.get() != null)); // 对象可能被回收了
    }
}

3. 虚引用(PhantomReference)

虚引用是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象实例。唯一的用处就是能在这个对象被收集器回收时收到一个系统通知。虚引用必须和引用队列联合使用,其主要作用是跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用,如果虚引用所引用的对象被垃圾回收,就会将虚引用加入到引用队列中,而不会像软引用和弱引用那样直接置为null。

由于虚引用不会影响对象的生存时间,也不能通过虚引用来获取对象实例,因此其示例代码与弱引用和软引用的示例代码类似,只是将WeakReferenceSoftReference替换为PhantomReference即可。


http://www.kler.cn/a/156285.html

相关文章:

  • 国家网络安全法律法规
  • 记录使用documents4j来将word文件转化为pdf文件
  • apache2配置多站点
  • 基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
  • vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录
  • 【云计算解决方案面试整理】1-2云计算基础概念及云计算技术原理
  • Ubuntu Server 20.04.6安装Anaconda3
  • javascript中的过滤操作
  • 11月推荐阅读的12篇大语言模型相关论文
  • 无需服务器,无需魔法,拥有一个微信机器人就是这么简单
  • 数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度
  • 性能测试常见面试题
  • 网络细节核心笔记
  • Android监听用户的截屏、投屏、录屏行为
  • Google Guava 反射工具使用详解
  • 用纯 CSS 实现网格背景
  • 【Node.js】Node.js环境下载与安装教程(Windows系统)
  • 《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-02-计算软件
  • 34、AD/DA
  • Vue 与 React
  • Python标准库:datetime模块【侯小啾python领航班系列(二十五)】
  • 【python爬虫】设计自己的爬虫 2. 数据保存封装 mongodb,mysql和elasticsearch
  • SQL -高阶3
  • Linux系统centos7防火墙firewall开放IP及端口命令
  • 2023.12.3 hive-sql日期函数小练习
  • k8s中批量处理Pod应用的Job和CronJob控制器、处理守护型pod的DaemonSet控制器介绍