强引用 软引用 弱引用 虚引用

《S32系列芯片——Boot & HSE详解》持续更新中... 专栏总目录,将详细介绍S32系列芯片的Boot功能,最终给出HSE基于IVT的Secure Boot方案!!! 阅读详情

在 JDK 1.2 版本之前,Java中的引用是很传统的定义:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称该reference数据是代表某块内存、某个对象的引用。这种定义并没有什么不对,知识现在看来有些过于狭隘了,一个对象在这种定义下只有“被引用”或者“未被引用”两种状态,对于描述一些“食之无味,弃之可惜”的对象就显得无能为力。譬如我们希望能描述一类对象:当内存空间还足够时,能保留在内存中,如果内存空间在进行垃圾收集后仍然非常紧张,那就可以抛弃这些对象----很多系统的缓存功能都符合这样的应用场景。

在JDK 1.2 版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。

强引用 - StrongReference

在 Java 中强引用是一种最常见的对象引用,把对象赋值给一个引用变量,那么这个变量就是一个强引用。例如使用关键字 new 创建的对象就是强引用,强引用是绝对不会被垃圾收集器回收的,当 JVM 内存空间不足时,JVM 即使抛出 OutOfMemoryError 错误也不会对强引用进行垃圾回收释放内存空间的。

String str = "abc";

软引用 - SoftReference

软引用是用来描述一些还有用,但非必须得对象,只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK1.2版之后提供了SoftReference类来实现软引用。
例如Springboot 中加载文件时的缓存:

SoftReference<Object> softRef = new SoftReference<>(obj);

弱引用 - WeakReference

弱引用也是用来描述哪些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2版之后提供了WeakReference类来实现弱引用。
例如:java.util.WeakHashMap

WeakReference<Object> weakRef = new WeakReference<>(obj)

虚引用 - PhantomReference

虚引用也称为“幽灵引用”或者“幻影引用”,她是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。在JDK1.2版之后提供了PhantomReference类来实现虚引用。
虚引用的主要作用是跟踪对象被垃圾回收的状态。

PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue);

引用强度

强引用 > 软引用 > 弱引用 > 虚引用

扩展

使用软引用实现JVM高速缓存

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

public class SoftReferenceCache<K, V> {

    private final Map<K, SoftReference<V>> cache = new HashMap<>();

    public void put(K key, V value) {
        SoftReference<V> softReference = new SoftReference<>(value);
        cache.put(key, softReference);
    }

    public V get(K key) {
        SoftReference<V> softReference = cache.get(key);
        if (softReference != null) {
            return softReference.get();
        } else {
            return null;
        }
    }

    public void clear() {
        cache.clear();
    }

}
MIPI D-PHY TX 一致性测试实例解析 Part 02 如果测过1.3.x,并对这组测试的细节已经熟悉的前提下,1.4.x的测试将会变得轻松,因为几乎相同的测试项被用于时钟通道的数据测量。 阅读详情

相关推荐

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

Java的四种引用

在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用,软引用、弱引用、虚引用。这四种引用的强度依次减弱。 强引用:指程序代码中普遍存在的,类似“Object obj = new Object();”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。 软引用:用来描述一些还有用但并非必需的对象,对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对...

qq_32100465的博客 247

最大似然估计、梯度下降、EM算法、坐标上升

主要讲解的是机器学习中参数学习算法之间的区别,以及应用的场景。 最大似然估计: 其中目标函数是对数似然函数。为了求目标函数取最大值时的theta。有两个关机键步骤,第一个是对目标函数进行求导,第二个是另导数等于0,求解后直接得到最优theta。两个步骤缺一不可。 梯度下降: 对目标函数进行求导,利用导函数提供的梯度信息,使参数往梯度下降最快的方向移动一小步,来更新参数。为什

tzl2093的博客 5141

强引用、弱引用、软引用、虚引用分别是什么?

强引用 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制会受到,即使该...

zhelong19830726的博客 310

13-单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊【单片机,物联网,上位机】: 说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系! 说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。 说明3:学会以后,下面的代码可能会跟你一辈子! 说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程! 拷贝这两个文件到自己的工程 ..

杨奉武的博客 1281

视觉SLAM的前段后端最详细的梳理(硕士入门知识框架更新)

文章目录视觉SLAM的组成结构视觉里程计(VO)-特征点法 -构建稀疏点云地图-直接法 -构建稠密或半稠密的地图 --需要使用 RGB-D 传感器视觉里程计--总结:SLAM 后端研究滤波器法非线性优化后端方式的差异(有五种优化方式):单目视觉里程计的初始化:运动估计:半直接法运动估计的优化方案:关于解决累计误差的一些方法:关键帧的建图及后端优化:特征的深度估计:图优化的后端研究:视觉与IMU融合的分类:视觉与IMU的融合的优势:存在的问题:优秀的开源: 视觉SLAM的组成结构 视觉里程计(VO) -特

DC 6812

JAVA基础 - 强引用、弱引用、软引用、虚引用

强引用:不会被回收; 软应用:内存不足时回收 弱引用:正常垃圾回收 虚引用:跟踪对象的正常垃圾回收 ...

zs1972551648的博客 1万+

Ubuntu20.04下Docker无缝升级实战指南

本文提供了一份在Ubuntu20.04系统上安全、无缝升级Docker的实战指南。文章详细阐述了升级前的版本检查、数据备份等准备工作,逐步演示了通过APT包管理器进行升级或指定版本安装的操作步骤,并强调了升级后的验证与常见问题回滚方案,确保业务容器平稳过渡。

postgres8guard的博客 481

强引用、软引用、弱引用、虚引用

如果不停的创建对象,总有一个时刻会占满内存空间,为了避免这种现象的发生,jvm会主动的将未使用的内存空间进行回收(GC)。java中基本数据类型分为两大类:1、基本数据类型;2、引用数据类型。JDK1.2中又将引用数据类型分为4类: 强引用、软引用、弱引用、虚引用,引入的目的是为了更好的管理内存空间。其中,FinalReference 被设计出来的目的是给 JVM 用的,这里暂时不学习。下面从强到弱学习四种引用类型。

qq_41163858的博客 3528

AIGC游戏测试自动化:AI如何提升游戏QA效率

随着游戏产业的蓬勃发展,游戏的复杂度和规模不断增加,传统的游戏测试方式面临着巨大的挑战。本文章的目的在于深入探讨AIGC技术在游戏测试自动化中的应用,分析AI如何提升游戏QA的效率。范围涵盖了从核心概念到实际应用的各个方面,包括算法原理、数学模型、项目实战案例以及未来发展趋势等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确AIGC和游戏测试自动化的相关概念和关系;接着讲解核心算法原理和具体操作步骤,通过Python代码进行详细说明;然后介绍数学模型和公式,并举例说明;

AI 原生应用开发的博客 1355

Raspberry Pi Pico + Inmp441麦克风(Pio模拟I2s)<2>

摘要:本文介绍了在Raspberry Pi Pico上使用PIO(Programmable I/O)接收I2S数字麦克风音频数据并保存为WAV文件的方法。项目采用双PIO状态机设计,一个生成I2S时钟信号(WS+SCK),另一个接收24位左声道数据并转换为16位格式。文章详细说明了接线方式、参数设置、WAV文件头构造、PIO汇编程序实现以及数据转换处理流程。项目在MicroPython环境下实现16kHz采样率、6秒时长录音,具有时序精确、稳定可靠的特性,并提供了进一步拓展的可能性,如双声道支持、实时频谱分

技术需要沉淀,需要碰撞。 660

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

前言 Java执行GC判断对象是否存活有两种方式其中一种是引用计数。 引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1. 强

傅红雪的专栏 3540

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3777

强引用、弱引用、软引用、虚引用

Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时终止软引用当内存不足时对象缓存内存不足时终止弱引用正常垃圾回收时对象缓存垃圾回收后终止虚引用正常垃圾回收时跟踪对象的垃圾回收垃圾回收后终止。

m0_74267125的博客 1672

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

强引用,弱引用,软引用,虚引用它们有什么区别?你知道吗?

本文详细解析了Java中的四种引用类型:强引用、软引用、弱引用和虚引用。首先回顾了JVM内存模型,包括栈、堆、方法区等组成部分。然后分别阐述了每种引用类型的特点: 强引用:最常见的引用类型,只要存在强引用,对象就不会被GC回收; 软引用:内存不足时会被回收,适合实现缓存功能; 弱引用:只要发生GC就会被回收,常用于ThreadLocal等场景; 虚引用:无法获取对象,主要用于管理堆外内存,需配合引用队列使用。 文章通过代码示例展示了每种引用的特性,并分析了它们的使用场景和内存管理机制,最后用表格对比总结概括

m0_70325779的博客 4095

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java强引用、软引用、弱引用、虚引用有什么区别?

在 Java 语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握 Java 对象生命周期和 JVM 内部相关机制非常有帮助。 在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。 强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么? 典型回答 1.强引用 特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用

小朱小朱绝不认输的博客 4196

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java中强引用、软引用、弱引用、虚引用

引用类型被回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时软引用内存不足时对象缓存内存不足时弱引用jvm垃圾回收时对象缓存gc运行后虚引用未知未知未知引用类型软引用和弱引用都可以简单实现缓存功能,在实现缓存功能的基础上又能保证缓存对象可以被及时回收。

pig_boss的博客 1665

什么是强引用、软引用、弱引用、虚引用?

什么是强引用、软引用、弱引用、虚引用?强引用(StrongReference):一般指的是对像被new出来,强引用一般不会被jvm收回,但会报OutOfMemory(内存不足)。Obje...

逍遥壮士 3742

强引用,软引用,弱引用,虚引用

与强引用、软引用和弱引用不同,虚引用并不能通过引用来获取对象的实例。如果一个对象只有弱引用,并且没有任何强引用指向它,那么在下一次垃圾回收时,垃圾回收器会将其标记为可回收,并在适当的时候进行回收。如果一个对象只有软引用,并且没有任何强引用指向它,那么在内存不足时,垃圾回收器可能会回收这个对象,以腾出更多的内存空间。如果只有弱引用指向一个对象,并且没有其他强引用指向它,那么在垃圾回收时,即使内存充足,垃圾回收器也可能回收该对象。当一个对象只有弱引用时,垃圾回收器在下一次进行垃圾回收时就可能会回收这个对象。

cang_ling的博客 1362

什么是强引用,软引用,弱引用,虚引用

强引用,软引用,弱引用,虚引用 强引用指的是代码中普遍存在的Object obj=new Object()这类的引用,只要强引用存在,垃圾收集器就不会回收被引用的对象, 软引用,有些有用但是并非必须的对象,在系统将要发生内存溢出之前,会把这些对象列进回收范围内进行二次回收,如果这次回收还是没有足够的内存将会抛出内存溢出异常,java中的softRefence表示软引用 public class ...

qq_41174684的博客 4143

Java中的强引用,软引用,弱引用和虚引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 一、强引用 如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

始则转俗成真,终乃回真向俗! 7072

Java中的强引用、软引用、弱引用与虚引用

一、前言 今天我们浅谈一下java的四种引用,分别是强引用、软引用、弱引用与序引用。在谈引用之前我们不得不提一下Java的垃圾回收器机制GC,GC算是Java的一大特点,我们都知道c语言是不能自动释放内存的需要程序员去操作的,而Java自带的垃圾回收机制是能够帮助程序员自动释放内存的。 所以在了解四种引用之前我们先了解一下GC GC:是Java自带的垃圾回收器,它是运行在独立的,优先级比较低的线程中,时刻都在检测与释放无用的内存,那是如何判断它是否有用,主要用的较多的判断方式就是引用计数。 JDK1

qq_48241564的博客 1746

强引用、软引用、弱引用、虚引用分别是什么?

整体架构 强引用(默认支持模式) 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是最常见的普通对象引用,只要还有前饮用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰到这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾机制回收的,即使该对象以后永远都不能被用到,JVM也不会回收。因此强引用是造成Java内存泄露的主要原因之一。

沈光阳的博客 1023
上一篇: static
下一篇: Linux 安装配置 ZooKeeper 集群
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值