Java中的四种引用及其用处

nCode:GlyphWorks案例教程一 nCode GlyphWorks案例一Comparing Frequency Content of Two Different Tests案例文件目标配置选择数据 Comparing Frequency Content of Two Different Tests 在本案例中,我们将比较来自两个不同测试的六个加速计通道的频率内容。将三轴加速度计放置在车辆的左前角和右前角,然后分别在两个不同的试验路面上行驶12分钟以上。 案例文件 此案例的文件(采用nCode DAC格式)位于nCode安装目录下的\demo 阅读详情

转载于:https://zhuanlan.zhihu.com/p/31218223

参考:https://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/index.html

 

Java中存在四种引用,StrongReference(强引用) 、SoftReferenc(软引用) 、WeakReferenc(弱引用)、PhantomReference(虚引用).虽然不常用,但是对于理解Java的回收等级还是很有帮助的,一句话来说这些引用只是不同回收等级的一种表现形式.

 


StrongReference(强引用)

强引用是最经常使用的一种引用,如new操作创建的对象就属于强引用.如下代码,对于强引用要记住无论如何JVM都不会去回收其内存.

Object obj = new Object();

 

SoftReferenc(软引用)

软引用是由java.lang.ref.SoftReference所提供的功能,被其所关联的对象不存在强引用并且此时JVM内存不足才会去回收该对象.
个人不知道其用处,做缓存的话,现在的企业项目基本不是单体架构所以用处不大,倒是可以做内存警告,当对象被回收时则说明系统所需要的内存不足,那么就可以发邮件通知相关人员.

WeakReferenc(弱引用)

弱引用是java.lang.ref包下的WeakReferenc类所提供的包装功能,对于弱引用JVM会回收仅被弱引用所关联的对象.也就是说弱引用对象会在一次gc之后被回收,如下代码,其中obj1没被回收,因为其的引用是强引用,但是weakObj1与其关联是弱引用,因此不属于被收回对象.weakObj2所关联的new Object()只有一个弱引用关联,因此会被回收.

Object obj1 = new Object();
WeakReference<Object> weakObj1 = new WeakReference<Object>(obj1);
WeakReference<Object> weakObj2 = new WeakReference<Object>(new Object());
//主动回收
System.gc();
System.out.println(weakObj1.get()); // 非null
System.out.println(weakObj2.get()); // null

 

Java中提供了一个很棒的工具类WeakHashMap,按照注释所说,该类是一个键为弱引用类型的Map,与传统Map不同的是其键会自动删除释放掉,因为gc()时会自动释放,因此很适合做缓存这一类的需求,下面代码是Tomcat所实现的LRU(最少使用策略)缓存算法的实现,关键点在注释中给出.

import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
public final class ConcurrentCache<K,V> {
    //LRU所允许的最大缓存量    
    private final int size;
    private final Map<K,V> eden;
    private final Map<K,V> longterm;
    
    public ConcurrentCache(int size) {
        this.size = size;
        //eden是主要缓存
        this.eden = new ConcurrentHashMap<>(size);
        //longterm是实现LRU算法的关键点.
        this.longterm = new WeakHashMap<>(size);
    }
    
    //get是先从eden中取出缓存,当不存在时则去longterm中获取缓存,并且此时获取到的缓存说明还在使用,因此会put到eden中(LRU算法)
    public V get(K k) {
        V v = this.eden.get(k);
        if (v == null) {
            synchronized (longterm) {
                v = this.longterm.get(k);
            }
            if (v != null) {
                this.eden.put(k, v);
            }
        }
        return v;
    }
    //put操作当size大于LRU最大容量时,则把缓存都放入到longterm,当this.eden.clear()后使其成为弱引用,那么LRU的实现则在get方法中体现了出来.
    public void put(K k, V v) {
        if (this.eden.size() >= size) {
            synchronized (longterm) {
                this.longterm.putAll(this.eden);
            }
            this.eden.clear();
        }
        this.eden.put(k, v);
    }
}

 

此方法如果操作时刚好遇到了一次gc,那么longterm的引用就会丢失,那么缓存就gg了.

PhantomReference(虚引用)

虚引用是由java.lang.ref.PhantomReference所提供的关联功能,虚引用对其原对象的生命周期毫无影响,其可以算是一种标记,当其所引用对象被回收时其会自动加入到引用队列中.也就是说你可以通过虚引用得到哪些对象已被回收.具体用法可以分析common.io中的org.apache.commons.io.FileCleaningTracker
该类中有一内部类class Tracker extends PhantomReference<Object>,也就是其包裹着虚引用对象,分析其构造函数,marker参数是该具体的虚引用,当marker被回收时,该对应的Track会被加入到引用队列queue中.

Tracker(String path, FileDeleteStrategy deleteStrategy, Object marker, ReferenceQueue<? super Object> queue) {
    //marker是具体的虚引用对象
    super(marker, queue);
    this.path = path;
    this.deleteStrategy = deleteStrategy == null ? FileDeleteStrategy.NORMAL : deleteStrategy;
}

 

文件删除则是该类维护的一个线程来进行的操作,既然对象回收后会加入到引用队列queue,那么该线程要做的功能自然是从引用队列中获取到对应的Track,然后执行其删除策略.
在这个流程中虚引用起到的是跟踪所包裹对象作用,当包裹的的对象被回收时,这边会得到一个通知(将其加入到引用队列).

@Override
        public void run() {
            // thread exits when exitWhenFinished is true and there are no more tracked objects
            while (exitWhenFinished == false || trackers.size() > 0) {
                try {
                    // Wait for a tracker to remove.
                    Tracker tracker = (Tracker) q.remove(); // cannot return null
                    trackers.remove(tracker);
                    if (!tracker.delete()) {
                        deleteFailures.add(tracker.getPath());
                    }
                    tracker.clear();
                } catch (InterruptedException e) {
                    continue;
                }
            }
        }

 

MATLAB算法实战应用案例精讲-【数模应用】装箱问题 装箱问题可以根据不同的维度进行分类。以下是一些常见的装箱问题二维装箱问题:二维装箱问题假设所有物品都是平面上的矩形,并且需要将它们放入平面上的容器中。这个问题的目标是找到一种装箱方案,使得物品不重叠并占据的总面积最小。三维装箱问题:三维装箱问题考虑到物品可以具有高度,并且需要将它们放入三维容器(如箱子或货柜)中。目标是找到一种装箱方案,使得物品不重叠且总体积最小。多维装箱问题:多维装箱问题是指在更高维度空间中进行装箱的问题。除了长度和宽度之外,物品可能具有其他属性,如高度、重量、形状等。 阅读详情

相关推荐

13.5元低成本模拟乘法器AD633JN实测:手把手教你避开那些坑

本文以13.5元低成本模拟乘法器AD633JN为核心,通过实测搭建混沌电路的全过程,手把手教你避开电源灌流、芯片发烫、输入偏置等常见陷阱。文章详细剖析了AD633JN的比例因子、输入阻抗等关键特性,并提供了正确的电源去耦、信号耦合及稳定性布线方案,旨在帮助硬件爱好者与工程师高效利用这款高性价比芯片,节省调试时间与成本。

weixin_28432777的博客 519

2017年——京东大神教你如何学习Java中的四种引用

Java中存在四种引用,StrongReference(强引用) 、SoftReferenc(软引用) 、WeakReferenc(弱引用)、PhantomReference(虚引用).虽然不常用,但是对于理解Java的回收等级还是很有帮助的,一句话来说这些引用只是不同回收等级的一种表现形式. StrongReference(强引用) 强引用是最经常使用的一种引用,如new操作创建的对象就属于强引...

weixin_33978016的博客 180

泛微E9集成登录实战:5分钟搞定第三方系统单点登录配置(附避坑指南)

本文详细解析了泛微E9集成登录的实战配置流程与核心原理。通过理解其基于信任代理的身份传递机制,文章指导用户如何在5-10分钟内完成第三方系统的单点登录对接,涵盖基础配置、核心参数设置、高级表达式应用,并提供了编码问题、账号不一致等常见避坑指南,助力企业快速构建统一身份认证门户。

weixin_29185493的博客 289

Java方法引用介绍

4)被引用方法的功能需要满足当前的需求。此时需要解释一下抽象方法:第一个参数:表示被引用方法的调用者,决定了可以引用那些类中的方法。在Stream流中, 第一个参数一般都表示流里面的每一个数据,假设流里面的数据是字符串, 那么使用这种方式进行方法引用,只能引用String这个类中的方法。

weixin_56633661的博客 1006

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2859

海康视觉通讯配置实战:TCP与Modbus协议深度解析

本文深度解析海康视觉系统与PLC通讯的实战配置,聚焦TCP与Modbus两大核心协议。详细阐述了TCP协议如何实现精准触发拍照,包括服务器端配置、数据转换(字符串与十六进制)的关键技巧与避坑指南;同时详解了Modbus协议用于读写PLC寄存器的配置方法、变量绑定及数据类型匹配。文章结合典型应用场景与高级调试技巧,旨在帮助工程师快速打通视觉系统与自动化设备间的数据通道。

m2n3o4p5的博客 826

Java中的引用及作用分析

若key是强引用,即使t1=null,但key还是指向ThreadLocal对象,所以会有内存泄漏,而使用弱引用的话,key会随t1的回收而被回收。当监测到虚引用被垃圾回收器回收后,可以作出相应的处理去回收堆外内存。但还是有内存泄漏的情况,如果key被回收后为null,则导致整个value再也无法被访问到,因此依然存在内存泄漏。一般new的对象就是强引用,只有在没有引用时才会被垃圾回收掉。随时被垃圾回收器回收,并且虚引用访问不到被引用的对象。堆内存空间不足时,才会被回收。只要发生gc,就会被回收。

hema_1850832417的博客 369

小论文/大论文必备 | RT-DETR目标检测、数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强,助力小论文和大论文实验涨点策略,平均提升模型mAP约1-2个百分点

RT-DETR目标检测数据增强策略研究 ,本文针对RT-DETR目标检测模型提出9种数据增强方法,包括几何变换(水平/垂直翻转、中心裁剪)、光照调整(亮度、对比度)和噪声添加(高斯/椒盐噪声)等。所有增强操作均保持图像与标签同步变换,确保训练数据的准确性。实验表明,该策略可提升模型mAP 1-2个百分点,对小目标检测效果尤为显著。文中提供了完整的Python实现代码,支持批量处理图像和标签文件,并详细说明了各增强方法的功能特点。该方法通过提升数据多样性,有效增强了模型在复杂场景下的鲁棒性和泛化能力。

Ai缝合怪、助力小伙伴高效发论文 460

【Java 干货教程】Java方法引用详解

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

向上的"狼"的博客 3098

时频分析之短时傅里叶变换(STFT)

本文利用MATLAB自带的spectrogram函数对信号做短时傅里叶变换。首先介绍了短时傅里叶变换(STFT)的背景及意义;其次,对spectrogram函数的用法以及变量的含义做了详细的解释;最后,利用MATLAB编写程序实现了信号的STFT。

总结论文中的算法并给出论文的复现代码 7万+

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1449

Java中的四大引用类型详解

【代码】Java中的四大引用类型详解。

未来会更好的博客 1165

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1567

Java的四种引用类型

文章目录一文读懂java中的Reference和引用类型简介强引用Strong Reference软引用Soft Reference弱引用weak Reference虚引用PhantomReferenceReference和ReferenceQueue四大状态三个Queue/ListWeakHashMap总结(原作者) 在看JVM的时候,发现Java引用类型反复出现;遂找了一篇总结博客来学习。 一文读懂java中的Reference和引用类型 一文读懂java中的Reference和引用类型 简介 ja

高高冷的博客 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA中的引用四种引用类型

关于值类型和引用类型的话题,C++、JAVA、python、go、C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言),当然此处我选择了JAVA,虽然我是搞C++的,具体原因都懂就不废话了。 一、值类型与引用类型   1、变量初始化 int num=10; String str="hello"      2、变量赋值   从上图可以显而易见,num是int基本类型变量,值就直接保存在变量中。str是String引.

渣渣 8839

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

详解 Java 中的四种引用

前言 在 Java 中,引用随处可见,我们通过类似 Object obj = new Object(); 的代码就可以创建一个引用,而我们直接通过这个代码段创建的引用被称为强引用(StrongReference),这种引用的特点是其指向的对象无论如何都不会被 JVM 的垃圾回收器(Garbage Collector)回收(即使是面临着发生 OutOfMemoryError 异常的风险)。 但是可能...

指点 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVA四种引用方式

java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括   强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的: 第一是可以让程序员通过代码的方式决定某些对象的生命周期; 第二是有利于JVM进行垃圾回收。 下面来阐述一下这四种类型引用的概念: 1.强引用  是指创建一个对象

我是一个包子 1万+

Java中的四种引用类型:强引用、软引用、弱引用和虚引用

在Java中,除了我们常见的强引用(Strong Reference)外,还有三种引用类型:软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。它们都是Java对象引用关系中的一部分,每种引用类型在Java内存管理和垃圾回收中都扮演着不同的角色。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7187

Java四种引用类型

文章目录引用类型简介对象可达性判断GC Roots对象可达性判断可达性状态类型可达性判断规则状态转换Reference类定义状态变化四种引用类型实现强引用FinalReference软引用SoftReference弱引用WeakReference虚引用PhantomReference 引用类型简介 Java开发者肯定都很熟悉java中的4种引用类型,它们从强到弱分别是: 引用类型 ...

qq_27639777的博客 1万+

Java中的四种引用类型及其使用场景

Java中的四种引用类型及其使用场景Java中的四种引用类型及其使用场景Java中的四种引用类型强引用软引用弱引用虚引用总结 Java中的四种引用类型及其使用场景 Java中的四种引用类型 Java中的引用相关类的架构如下所示 强引用 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量

匿迹 2406

Java四种引用

简介 在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强 度依次逐渐减弱。 引用 强引用 不会被回收 正常编码使用 软引用 内存不够了,被GC 可作为缓存 弱引用 GC发生时 可作为缓存(WeakHash...

Penguin 4817

java中的四种引用及其使用场景

Java的对象引用一共有四种方式:强引用,软引用,弱引用,虚引用 强引用-StrongReference 这是java中最常见的引用方式,当一个对象被一个或一个以上的引用变量所引用时,它不可能被系统垃圾回收机制回收 使用场景:例如数组 软引用-SoftReference 对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收;如果内存空间不足了,就会被回收 使用场景:创...

每天进步一点点 2383

Java中的四种引用类型

java中的四种引用类型

sugarxxc的博客 8265

Java中的四种引用

相关概念 java有4种引用,可分为强引用(NormalReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(phantomReference)gc:java的垃圾回收机制首先明白什么是一个引用? Object o = new Object()这就是一个引用了,一个变量指向new出来的对象,这个变量就叫一个引用,引用这个东西,在java里面分4种,普通的引用比如Object o = new Object(),这个就叫强引用,强引用有什么特点呢?我们来看下面

小小葩的博客 2370

Java中的四种引用类型是哪些?

从一开始学习Java我们就知道Java的数据类型一般有两种,一种是基本数据类型,另一种是引用数据类型。其中,基本数据类型的值通常储存在栈内存中,用于对该类型的对象进行存储;而引用数据类型则在存储堆中对需要引用的对象进行引用。 引用是Java面向对象的一个特点,如果一个对象不曾被任何变量应用的话,那么整个程序也就无法再使用这一对象。四种引用类型可以说是在学习Java的过程中经常会接触到的。Java中主要包括了四种引用类型,分别是:强引用,软引用,弱引用以及虚引用。 一、强引用 强引用是一种最常见的引用形式,

周二Show 6116

【JAVA】java中的四种引用

java中的四种引用 JDK1.2之后,把对象的引用分为四种状态,即强引用、软引用、弱引用和虚引用。这样的方式,可以更加灵活地控制对象的生命周期。 一、强引用 开发中用的最多的就是强引用了。 强引用声明格式: String str="abc"; 只要某个对象与强引用关联,那么JVM在内存不足的...

阳阳的博客 3万+
上一篇: Java的三种代理模式
下一篇: 反射及动态代理
ArtisticProgramming
博客等级 码龄8年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值