Java的4种引用

Java中的方法引用--【基本使用详解】 温馨提示: 什么是方法引用? 方法引用符 如何使用方法引用? 通过对象名引用成员方法 通过类名引用静态方法 通过super引用成员方法 通过this引用成员方法 类的构造器引用 数组的构造器引用 总结 阅读详情

        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;
                }
            }
        }

Java学习视频

Java基础:

Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化 **摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。 阅读详情

相关推荐

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2503

java的Stream和方法引用

Stream和方法引用 1. Stream流 1.1. Stream流引入 Stream流完全不是I/O流,按照流水线处理方式来考虑代码中的思想。 JDK1.8 之后,我们拥有了Lambda表达式,让代码的中心偏向解决实际问题,直到重点,可以提高效率。 Stream流中使用了大量Lambda表达式,利用Lambda操作方式,提供开发效率。 1.2 传统遍历方式和Stream类处理方式对比 package com.qfedu.a_stream; import java.util.ArrayList; /** * 操作集合处理集合 * 操作过程中创建了多个ArrayList,但是这些

mtk芯片机型备份线刷包工具 多个版本集合资源

mtk芯片机型备份线刷包工具 多个版本集合资源1---资源可以联机查看手机当前版本信息等参数2----资源可以备份mtk机型的线刷固件【早期65系列】新版本不一定3----资源可以写串 改串 【部分机型】4---如果可以备份的线刷包.固件可以sp平台线刷5---多个版本收录集合到一起。解压选择使用6---资源需要开机状态或者强开usb调试状态联机识别7----资源需要root的情况下才可以备份8---版本不同 备份的资源不同。主要是user用户数据分区。低版本不备份 高版本备份【预留存储空间】需要的友友下载使用https://blog.csdn.net/u011283906/article/details/125635253?spm=1001.2014.3001.5501

Java 基础篇】Java方法引用详解

本文详细介绍了Java方法引用的概念、语法和使用方法。方法引用Java 8引入的重要特性,可以简化函数式编程的代码编写,提高开发效率。通过学习和应用方法引用开发人员可以编写更简洁、易读的代码,并利用函数式接口、Lambda表达式、Stream API等技术实现更高效的程序。希望本文对你理解和应用Java方法引用有所帮助!

繁依Fanyi的博客 6511

java方法引用详解

1.构造器引用和数组引用

qq_55278081的博客 2572

JAVA进阶 —— 方法引用

方法引以及方法引用的分类:引用静态方法、引用成员方法、引用构造方法、 其他调用方法

hdakj22的博客 4866

JAVA引用proj4j

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1如何在Java项目中引用Proj4j库 在GIS(地理信息系统)工作中,proj4j是一个常用的库,能够帮助我们处理坐标转换。本文将指导你如何在Java项目中引用proj4j库。以下是实现...

weixin_30673943的博客 635

4Java引用浅解

最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。 之所以想学习一下Java的几种引用类型,原因有两个: 理解Java Cache实现、学习Java引用Java垃圾回收机制的关系 内存资源是有限的,需要合理的利用。Cache不是仅仅HashMap那么简单,Java引用Java

永无止境,上下求索 1万+

JVM-Java中的4引用类型

JVM-Java中的4引用类型

weixin_45226668的博客 276

Java工程师必看指南的【4引用

🏫系列专栏:1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣介绍JAVA 中有 4 种类型的引用:这些引用的区别仅在于管理它们的方式。如果你从未听说过它们,这意味着你只使用强大的。了解差异可以帮助您,特别是如果您需要存储临时对象并且无法使用真正的缓存库(如eHcache或Guava)。由于这些类型与 JVM 垃圾回收器密切相关,因此我将简要回顾一下有关 JAVA 中垃圾回收的一些信息,然后介绍不同的类型。

2401_89191964的博客 1849

java4引用

分别是强 软 弱 虚。

m0_46687972的博客 164

java4种_Java4引用

java引用的重要性无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都跟引用相关考虑一种场景,如果对象只有两种状态——被引用(不可回收)与不被引用(将被回收),也就是只有0和1,一般情况下是没什么所谓的。但是,如果引用搭载到服务器上,存在高并发,而有一些对象是有时取到的,在只有0和1的情况下,那么将会导致在对象此时不被使用的时候被回收,需...

weixin_32616935的博客 93

Java4引用的简要解释

在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物品已经被扔到垃圾箱,想再 把它捡回来使用就不可能了。     但有时候情况并不这么简单,你可能会遇到类似鸡肋一样的物品,食之无味,弃之可惜。

KindAzrael的专栏 1344

Java4引用的详述

java 中的 4引用方式,适用于不同的场景,重点需要理解虚引用,结合文字和代码 强引用 被强引用的对象,不会被垃圾回收器回收,JVM 宁愿抛出 OOM 也不会去回收被强引用的对象; M m = new M(); 软引用 当堆空间够用时,GC 不会对软引用的对象进行回收,当堆空间不足以分配新的空间时,触发 GC 就会对这部分对象进行回收,通常用在缓存等领域。将缓存对象使用软引用,空间不足的时候释放这部分空间,需要再次使用的时候,重新从 DB 中加载即可。 另外软引用可以配合队列(Refer

ETFOX 182

java当前4引用_Java四种引用

1.强引用如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。2.软引用(SoftReference)如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收...

weixin_39614637的博客 108

java4引用类型

java中的4引用类型,强引用、软引用、弱引用、虚引用。说这4引用之前,需要先说一下垃圾回收机制中的finalize()方法,finalize()方法是Object中的方法,它只有一个空的方法体,并且被protected修饰:当一个java对象被当成垃圾回收的时候,垃圾回收器会负责调用finalize()方法。

爪哇人的博客 2886

Java4引用

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

qq_30944187的博客 338

java中的4引用:强引用、软引用、弱引用和虚引用

我们知道java语言提供了4引用类型:强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference),与引用密切相关的,还有一个引用队列ReferenceQueue。引用引用队列的关系,对于垃圾回收来说非常重要,学习垃圾回收机制,必须要先了解引用引用队列的使用方法。本文主要参考网上的一些理论,同时配合自己的一些测试代码,更好的...

天才小站 302

Java 4引用的用途

当一个对象只被虚引用变量引用时,垃圾回收器会将该对象加入引用队列中,而不是直接回收该对象。当一个对象只被软引用变量引用时,垃圾回收器将在内存不足时尝试回收该对象。在并发编程中,软引用经常被用来实现内存敏感的缓存,例如,可以使用软引用来缓存最近使用的图片或文本,一旦内存不足,垃圾回收器就会回收这些对象,从而释放内存。在并发编程中,弱引用经常被用来实现对象监视器,例如,可以使用弱引用来监视一个对象的状态,当对象被回收时,该对象的状态也将被相应地清除。Java四种引用,分别为强引用,软应用,弱引用,虚引用

weixin_42710740的博客 523
上一篇: Java常用技术
下一篇: 学Java可以做什么?
程序媛_小白
博客等级 码龄5年 321粉丝 163原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值