再谈有关JVM中的四种引用

news2024/9/21 2:31:12

1.强引用

强引用就是我们平时使用最多的那种引用,就比如以下的代码

//创建一个对象
Object obj = new Object();//强引用

这个例子就是创建了一个对象并建立了强引用,强引用一般就是默认支持的当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象。即使在解除对对象的强引用后,只要系统内存充足,垃圾回收器不会立即回收对象。强引用使得对象在被引用时一直保持有效,直到引用被显式解除。

以下三种引用就是比较不常见的了,这三种引用虽然叫引用但是和我们理解的那种栈上的变量指向堆上的对象的指针不是一回事。

千万不要将软弱虚这三种引用理解为那种栈上的变量指向堆上的对象的指针。

软引用、弱引用、虚引用:这三种引用其实就是一个个的类,通过对应的类名翻译过来的中文名称。

// 软引用
public class SoftReference<T> extends Reference<T> {

}

// 弱引用
public class WeakReference<T> extends Reference<T> {
  
}

// 虚引用
public class PhantomReference<T> extends Reference<T> {
  
}

 

2.软引用

发生了垃圾回收,并且回收后内存仍然不足,并且被软引用指向的对象没有强引用,那么被软引用指向的对象就会被回收。

public class SoftReferenceDemo {
    public static void main(String[] args) {

        Object a = new Object();
        SoftReference softReference = new SoftReference<>(a);//软引用

        //a和软引用指向同一个对象
        System.out.println(a);//java.lang.Object@4554617c
        System.out.println(softReference.get());//java.lang.Object@4554617c
        
        //内存够用,软引用不会被回收
        a = null;
        System.gc();//内存够用不会自动gc,手动唤醒gc
        System.out.println(a);//null
        System.out.println(softReference.get());//java.lang.Object@4554617c

        //内存不够用时
        try{
        //配置Xms和Xmx为5MB
            byte[] bytes = new byte[1024102430];//设置30MB超内存
        }catch (Throwable e){
            e.printStackTrace();
        }finally {
            System.out.println(a);//null
            System.out.println(softReference.get());//null
        }
    }
}

第一步

第二步撤了对a对象的强引用只剩软引用了,手动唤醒gc对象被清除了

3.弱引用

弱引用(Weak Reference)是Java中一种比强引用更弱的引用类型。当一个对象只被弱引用关联时,在下一次垃圾回收时,该对象就有可能被回收。垃圾回收器会在适当的时候回收仅被弱引用持有的对象,即使内存并不紧张。

public class WeakReferenceDemo {
    public static void main(String[] args) {
        // 创建一个对象并建立弱引用
        Object obj = new Object();
        WeakReference<Object> weakRef = new WeakReference<>(obj);

        // 对象仍然存在,可以正常使用
        System.out.println("Object is still accessible: " + weakRef.get());

        // 解除对对象的强引用
        obj = null;

        // 手动触发垃圾回收
        System.gc();

        // 垃圾回收后,对象被回收,弱引用返回null
        System.out.println("Object after garbage collection: " + weakRef.get());
    }

}

  • 软引用和弱引用一般都可以被用于实现内存敏感的缓存
  • ThreadLocalMap中的entry实体就是一个弱引用
static class ThreadLocalMap {

      // Entry是一个弱引用
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }
}

为什么要在ThreadLocal中使用弱引用?

先简单说一下在 ThreadLocal 的实现中,它使用了一个名为 ThreadLocalMap 的哈希表来存储每个线程的局部变量。这个 ThreadLocalMap 的键(Key)是 ThreadLocal 对象的弱引用,而值(Value)则是与线程相关联的实际对象。

1.防止内存泄露:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

2.灵活的内存管理:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个 ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

4.虚引用

虚引用(Phantom Reference)是Java中最弱的引用类型之一,无法通过引用直接获取到对象实例。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象,我们甚至无法通过get方法获取到对象实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java--数据结构】二叉树oj题(上)

前言 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 判断是否是相同的树 oj链接 要判断树是否一样&#xff0c;要满足3个条件 根的 结构 和 值 一样左子树的结构和值一样右子树的结构和值一样 所以就可以总结以下思路…

js补环境系列之剖析:原型、原型对象、实例对象三者互相转化(不讲废话、全是干货)

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 思考下&#xff1a;js补环境中&#xff0c;什么场景会用到原型、原型对象、实例对象&#xff1f; 举…

最大文件句柄数

优质博文&#xff1a;IT-BLOG-CN 灵感来源 一、什么是文件句柄 文件句柄File Handle是操作系统中用于访问文件的一种数据结构&#xff0c;通常是一个整数或指针。文件句柄用于标识打开的文件&#xff0c;每个打开的文件都有一个唯一的文件句柄。 它们是对文件、网络套接字或…

商业数据分析思维的培训PTT制作大纲分享

商业数据分析思维的培训PTT制作大纲: 基本步骤: 明确PPT的目的和主题 收集并整理相关内容资料 构思并确定PPT的框架大纲 编写PPT的内容文字 插入图片、图表等视觉元素 设计PPT的版式和模板 排练并修改PPT 输出并备份最终版本 目的:数据思维培养; 主题:商业数据分…

【TensorRT】Yolov5-DeepSORT 目标跟踪

Yolov5-DeepSORT-TensorRT 本项目是 Yolo-DeepSORT 的 C 实现&#xff0c;使用 TensorRT 进行推理 &#x1f680;&#x1f680;&#x1f680; 开源地址&#xff1a;Yolov5_DeepSORT_TensorRT&#xff0c;求 star⭐ ~ 引言 ⚡ 推理速度可达25-30FPS&#xff0c;可以落地部署&…

PriorityQueue 阅读记录

1、前言 1、优先队列&#xff0c;底层通过数组来构造树&#xff08;二叉树) 来实现的。 2、默认是最小堆&#xff08;取出来的是最小值)&#xff0c;可以通过传入一个比较器 comparator 来构造一个最大堆。 3、传入的参数不能为空&#xff0c;否则抛出NPE问题。 4、最大堆的…

git自动pull同步远程若干分支与本地若干分支

git自动pull同步远程若干分支与本地若干分支 假设远程代码仓库有100个分支&#xff0c;而本地只有10个本地分支与远程分支一一对应&#xff0c;现在要保持本地的这个10个分支与远程一致&#xff0c;最笨的方法是checkout到每个分支&#xff0c;然后一个一个的 git pull origin…

第11章 规划过程组(四)(11.4规划质量管理)

第11章 规划过程组&#xff08;四&#xff09;11.4规划质量管理&#xff0c;在第三版教材第412~414页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;工具与技术 1、数据分析&#xff08;重要知识点&#xff09; 成本效益分析 确定质量活动的可能成本与预期效益&a…

HTML2048小游戏

源代码在效果图后面 效果图 源代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>2048 Game&l…

Qt Creator的好用的功能

&#xff08;1&#xff09;ctrlf&#xff1a; 在当前文档进行查询操作 &#xff08;2&#xff09;f3: 找到后&#xff0c;按f3&#xff0c;查找下一个 &#xff08;3&#xff09;shiftf3: 查找上一个 右键菜单&#xff1a; (4)f4&#xff1a;在…

【海外云手机】静态住宅IP集成解决方案

航海大背景下&#xff0c;企业和个人用户对于网络隐私、稳定性以及跨国业务的需求日益增加。静态住宅IP与海外云手机的结合&#xff0c;提供了一种创新的集成解决方案&#xff0c;能够有效应对这些需求。 本篇文章分为三个部分&#xff1b;静态住宅优势、云手机优势、集成解决…

FPGA资源容量

Kintex™ 7 https://www.amd.com/zh-tw/products/adaptive-socs-and-fpgas/fpga/kintex-7.html#product-table AMD Zynq™ 7000 SoC https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html#product-table AMD Zynq™ UltraScale™ RFSoC 第一代 AMD Z…

对象存储解决方案:高性能分布式对象存储系统MinIO

文章目录 引言I 自动化数据管理界面1.1 图形用户界面:GUI1.2 命令行界面:MinIO CLI1.3 应用程序编程接口:MinIO APIII 部署集成2.1 静态端口分配2.2 将NGINX用作反向代理,配置负载。III 基础概念3.1 为什么是对象存储?3.2 MinIO支持哪些系统拓扑结构?3.3 时间同步3.4 存储…

react学习——28react-redux实现多组件共享数据(精简版)

1、目录结构 2、containers/Count/index.js import {createIncrementAction, createDecrementAction, createIncrementAsyncAction} from ../../redux/action/count //引入conect用于链接UI组件与redux import {connect} from react-redux import React, {Component} from &qu…

UML面向对象分析与设计

UML不是OOA/D&#xff0c;也不是方法&#xff0c;它仅仅只是一种图形表示法如果不掌握对象思想&#xff0c;那么UML或任何case工具(如ROSE)将毫无意义 我们需要一种用于〇OA/D的语言&#xff0c;这既是一种思考的工具&#xff0c;也是一种沟通的形式。因此&#xff0c;我们将在…

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

前端基础之JavaScript学习——变量、数据类型、类型转换

大家好&#xff0c;我是来自CSDN的博主PleaSure乐事&#xff0c;今天我们开始有关JS的学习&#xff0c;希望有所帮助并巩固有关前端的知识。 我使用的编译器为vscode&#xff0c;浏览器使用为谷歌浏览器&#xff0c;使用webstorm或其他环境效果几乎一样&#xff0c;使用系统自…

搞清c++中的队列(queue)以及双端队列(deque),以及常用的接口!

1. 队列 概念&#xff1a;Queue是一种先进先出(First In First Out,FIFO)的数据结构&#xff0c;它有两个出口 特征&#xff1a; 队列容器允许从一端新增元素&#xff0c;从另一端移除元素 队列中只有队头和队尾才可以被外界使用&#xff0c;因此队列不允许有遍历行为 队列…

【React Hooks原理 - forwardRef、useImperativeHandle】

概述 上文我们聊了useRef的使用和实现&#xff0c;主要两个用途&#xff1a;1、用于持久化保存 2、用于绑定dom。 但是有时候我们需要在父组件中访问子组件的dom或者属性/方法&#xff0c;而React中默认是不允许父组件直接访问子组件的dom的&#xff0c;这时候就可以通过forwa…

进程通信(3): System V IPC

System IPC包括System V消息队列&#xff0c;System V信号量&#xff0c;System V共享内存区。 System V IPC使用一个key&#xff08;key_t&#xff09;作为他们名字&#xff0c;这个值由ftok函数通过路径名和一个id生成。 客户和服务器通过在路径名和id达成一致&#xff0c;双…