Java中引用的概念

Setup&Hold互卡问题和Useful Skew的影响 setup和hold互卡问题分析 阅读详情

序言:

Java对于引用概念经历过两个时期,JDK1.2之前和JDK1.2之后。在JDK1.2以前Java对于引用的定义很传统,如果reference类型的数据中存储的数值指定是另外一块内存的起始地址,就称为这块内存代表着一个引用.这个定义过于狭隘,在整个应用中对象就存在两种状态存在引用或者不存在。这样会产生一定的问题,对于我们应用系统存在于一些对象只在初始化使用一次(却被其它对象引用),存在一些对象是不经常被调用(也被其它对象引用),也存在一些对象是一直在被使用的。当内存资源足够的情况下,不会发生太大问题,一旦出现内存中资源紧缺,我们需要释放一些对象内存。我们肯定是期望这些只在初始化使用一次和不经常被调用的对象的内存释放出来。但是因为被引用的对象是不会被垃圾回收器给回收掉的,所以终止就会导致系统因内存而直接崩溃,这种现象我将其类比于以前的大锅饭(不论干不干活都有饭吃)。

针对于上述JDK1.2的状况Java在JDK1.2之后对于引用的概念细致化分为4种(让我们可以针对不同情况使用不同引用),分别为强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用 (Phantom Reference).4种引用强度依次降低。java对于这四种引用的具体实现在java.lang.ref包下,如图所示。

类所在包情况:

完整类图:

2.1:强引用(Strong Reference)

java中最普遍存在的引用类型.例如我们在Object obj = new Object()时就会产生的这样的引用。在java应用中只要上述情况的强引用存在,垃圾回收器永远不会回收被引用对象。

2.2:软引用(Soft Reference)

软引用:可引用一些有用但却不是应用必须的对象,对于这些对象在应用内存资源不足(垃圾回收器已经进行过一次回收了),要发生内存溢出之前,垃圾回收器将这些对象列为可回收对象范围之内再进行第二次回收,如果此次回收内存资源还是不足,那么就会发生内存溢出溢出。在java中使用SoftReference类来实现软引用。

2.3:弱引用(Weak Reference)

弱引用和软引用的功能一样也是用以引用非必须的对象。但是它的强度比软引用更弱,不论jvm中内存是否充足,垃圾回收器在下一次垃圾回收的时候这些被弱引用的对象肯定会被回收。在java中使用WeakReference类来实现弱引用。

2.4:虚引用(Phantom Reference)

虚引用在四种引用类型中最弱的一种引用关系,它的存在对于对象的生存时间没有丝毫影响,也无法通过虚引用来获取一个对象的实例。它实际的作用是在当该对象被垃圾回收是可触发系统通知。在java中使用PhantomReference来实现虚引用。

2.5:引用队列 ReferenceQueue

通过查看SoftReference,WeakReference,PhantomReference三种不同类可以看到在初始化方法中都有ReferenceQueue的的影子,ReferenceQueue在其中充当的角色是用以实现在被三种引用对象被gc时,其它线程可以通过ReferenceQueue可以进行感知并作出一些处理。(后续有代码测试 )

3:代码应用:

3.1:强引用

/**
 *强引用测试 为测试效果使用-Xmx10m -Xms10m
 */
public class StrongReferenceTest {

    //堆内
    public  static List<Byte[]> datas = new ArrayList<>();

    public static void main(String[] args) throws Exception {

        for (int i=0;i<10;i++ ) {
            datas.add(new Byte[1024*1024]);
            Thread.sleep(100);
            //触发gc
            System.gc();
        }

    }
}

运行结果:

3.2:软引用测试

/**
 * 软引用测试 设置内存大小为10m -Xmx10m -Xms10m
 * @author fangyuan
 */
public class SoftReferenceTest {

    public  static List<SoftReference<Byte[]>> datas = new ArrayList<>();

    public static void main(String[] args) throws Exception {

        for (int i=0;i<5;i++ ) {
            SoftReference<Byte[]> srf = new SoftReference<Byte[]>(new Byte[1024*512]);
            datas.add(srf);
        }
        //验证数据是不是被gc掉
        for (SoftReference softReference:datas) {
            System.out.println(softReference.get());
        }

    }
}

运行结果:

从上述结果可以看到:当jvm感觉内存不足时(内存不足的定义是什么?与堆内存大小以及该引用对象get的时间都有关系),垃圾回收器会回收软引用对象。

3.3 弱引用测试

/**
 * 弱引用测试  这里不设置最大内存大小
 * @author fangyuan
 */
public class WeakReferenceTest {

    public  static List<WeakReference<Byte[]>> datas = new ArrayList<>();

    public static void main(String[] args) throws Exception {

        for (int i=0;i<5;i++ ) {
            WeakReference<Byte[]> weakReference = new WeakReference<Byte[]>(new Byte[1024*512]);
            datas.add(weakReference);
        }

        //验证数据
        for (WeakReference weakReference:datas) {
            System.out.print(weakReference.get());
        }

        System.out.println();

        //触发gc
        System.gc();

        Thread.sleep(1000);

        //验证数据是不是被gc掉
        for (WeakReference weakReference:datas) {
            System.out.print(weakReference.get());
        }

    }
}

结果:

测试结果发现,弱引用对象只能存活到下一次垃圾回收器开始工作之前,无关于现有系统内存大小。

3.4 虚引用

//源码
public class PhantomReference<T> extends Reference<T> {

    //虚引用无法通过get方法获取对应实例对象
    public T get() {
        return null;
    }

    //初始化 配合ReferenceQueue做到被引用对象被gc之后能过通知用户线程 进行额外处理
    public PhantomReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }

}

测试代码当gc虚引用时,用户线程得知并作出处理:

/**
 * 测试ReferenceQueue 与PhantomReference 不设置内存最大值
 * @author fangyuan
 */
public class PhantomReferenceTest {

    public  static List<PhantomReference<Byte[]>> datas = new ArrayList<>();

    public  static ReferenceQueue<Byte[]> referenceQueues = new ReferenceQueue<>();

    public static void main(String[] args) throws Exception {

        //设置
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int count =0 ;
                while(true){
                    try {

                        Reference<? extends Byte[]> pr;
                        if ((pr = referenceQueues.remove()) !=null){
                            System.out.println("第"+(count++)+"个回收了对象"+pr);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            }
        });

        thread.setDaemon(true);
        thread.start();

        while (true) {
            PhantomReference<Byte[]> phantomReference = new PhantomReference<Byte[]>(new Byte[1024*1024],referenceQueues);
            datas.add(phantomReference);
        }

    }
}

测试结果:

常说的cache机制到底是什么?L1 cache和 L2 cache是什么? 一文带你迅速了解CPU内的cache机制!!图解多核CPU中的多级cache结构。为何有的处理器没有cache? 阅读详情

相关推荐

草莓成熟度与叶片病虫害智能检测数据集应用全解析

本文深入解析草莓成熟度与叶片病虫害智能检测数据集的应用价值,涵盖从绿草莓到红果转色的完整成熟周期及白粉病、炭疽病等7种病害的精准识别。通过实战案例展示如何提升病害识别率至94%,并介绍数据集的科研价值,包括跨品种迁移学习和多模态数据融合技术。

weixin_28366353的博客 275

全面讲解Java引用

1.什么是引用? 简单的说,引用是一个对象别名,与被引用的对象共享同一块内存区域。例如“鹿晗”这个对象,他的原名是“刘壮实”,但两者其实都是指同一个人(内存)。对象在创建时会请求一块内存空间来保存数据,会根据对象大小分配存储空间大小不等的内存区域。在Java中,访问对象时,不会直接访问对象在内存中的数据,而是通过引用去访问。因此,引用也是一种数据类型,类似于C/C++ 语言中的指针。引用定义时在栈中分配内存,引用变量在程序运行到作用域外释。 注意:引用可以独立存在,并不一定依赖于一个对象,例如: Strin

shaomingmin的博客 2594

从AND到XOR:5种门控电路在PrimeTime中的检查策略差异

本文深入探讨了AND、NAND、OR、NOR和XOR五种门控电路在PrimeTime静态时序分析中的检查策略差异。重点解析了XOR门控因其非单调性而无法被工具自动推断,需要工程师手动配置的特殊性,并提供了针对各类门控的配置模板与调试技巧,以确保时钟网络的完整性与芯片设计的可靠性。

rgv2345678的博客 269

Java中的引用概念

Java中数据类型可分为两大类:引用类型(reference)和基本类型(primitive)。 1)基本类型 基本类型有8种:boolean、char、byte、short、int、long、float、double。它们都有相应的包装类,这些包装类都属于引用类型,它们依次是:Boolean、Character、Byte、Short、Integer、Long、Float、Double。 2

leunggaoxiang的专栏 903

SpringCloudGateway网关高频20个面试题整理

Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 构建的 API 网关,提供动态路由、监控、弹性、安全等核心功能。Spring Cloud Gateway 是 Spring Cloud 生态中的 API 网关,用于微服务架构中的请求路由、负载均衡、限流、鉴权等。实现@Component@Override// 逻辑处理。

u012024132的专栏 1114

【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(AHB-SRAMC SVTB Overview)

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。 文章目录一、内容概述二、AHB-SRAMC 验证计划 一、内容概述 AHB-SRAMC 验证计划 AHB-SRAMC 验证平台的架构图 AHB-SRAMC 验证平台的代.

悟已往之不谏 知来者之可追 2652

java引用详解

它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。Java表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。

2401_84024148的博客 2445

连接参数详解:Connection Interval, Slave Latency, Supervision Timeout 的协同与调优实战

在低功耗蓝牙(BLE)开发与调试中,Connection Interval(连接间隔)、Slave Latency(从机延迟) 和 Supervision Timeout(监督超时) 是三个核心参数。它们不仅直接影响设备的通信性能、功耗表现和连接稳定性,更是各类技术面试与认证考试的高频考点。本文将从基础概念出发,深入剖析三者的协同机制,结合历年真题解析考点与解题思路,并通过实战案例演示调优方法,快速掌握这一核心知识点。

byte轻骑兵的技术小窝 2761

区分java_Java中四种引用的区分

强引用(StrongReference)强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛...

weixin_34723270的博客 259

VS Code 重大更新:Agent Skills完美支持!

代码不会骗人,但你的 LLM 可能会编个故事——除非你给它一本《技能手册》。——某位深夜调试成功的 Go 工程师。

weixin_44058951的博客 3459

无需Python环境!纯C#上位机+OpenCVSharp4+ONNX Runtime实现YOLOv8摄像头实时流检测,工业级稳定

摘要 工业自动化C#开发中,传统Python方案实现视觉检测功能存在环境依赖、内存泄漏和性能不稳定等问题。本文提出基于.NET 8+OpenCVSharp4+ONNX Runtime的纯C#方案,通过实际案例验证其优势: 零Python依赖,支持离线部署 内存稳定(380MB/72h),检测延迟<80ms 检测精度达漏检率<0.1%,误检率<0.5% 保留原有业务逻辑代码,3天完成适配 方案采用分层架构设计,支持多种硬件平台和操作系统,提供从模型导出到部署的全流程指导,为工业视觉检测提供高

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 196

Java中对象引用是什么意思

在Java中,对象的引用指的是一个变量,该变量存储了对象在内存中的地址。变量本身并不直接存储对象的实际内容,而是存储了对象的引用,通过引用可以访问和操作对象的属性和方法。变量可以存储基本数据类型的值,也可以存储对象的引用,即对象在内存中的地址。引用的概念使得在Java中可以方便地操作和传递对象,同时也引入了一些概念,如对象的生命周期、引用的传递、垃圾回收等。特别需要注意的是,对于基本数据类型(如整数、浮点数等),变量存储的是实际的数值,而对于对象类型,变量存储的是对象在堆内存中的地址。

weixin_53850894的博客 670

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 561

java中对象 引用的概念_java中引用的概念

强引用(StrongReference)强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛...

weixin_36176188的博客 227

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中引用和对象的概念

1.对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。 2.引用:引用时一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向了堆内存当中的对象。 注意: 所有访问实例相关的数据,都需要通过“引用.”的方式访问,因为只有通过引用才能找到对象。只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。 ...

weixin_52326703的博客 997

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java面试八股之强软弱虚引用的概念及区别

当垃圾回收器准备回收一个对象,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。在Java中,强引用、软引用、弱引用和虚引用是四种不同类型的引用,它们在对象生命周期管理、垃圾收集(Garbage Collection, GC)以及内存管理方面有着不同的行为和用途。- 概念:弱引用比软引用更弱,即使内存空间足够,只要一个对象只有弱引用存在,那么在下一次垃圾收集时,该对象就会被回收。- 虚引用不决定对象的生命周期,仅在对象被回收时提供通知机制,常用于追踪对象回收情况。

u012151345的博客 632

VC中sqlite的使用

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

java中引用的概念

强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: 1 2 Object object = newObject(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况...

weixin_30648963的博客 93

java强引用、软引用、弱引用、虚引用的概念理解

基本概念 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念: 1、强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只

weixin_41590779的博客 200

JAVA 强引用、软引用、弱引用、虚引用的概念

一.了解 强引用、软引用、弱引用、虚引用的概念   在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。   从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概

liupengjun11的博客 173

JAVA中 强引用、 软引用、 虚引用、 弱引用的概念

在JDK1.2以前,Java中引用的定义很传统,如果一个refernece类型的数据中,存储的数值代表了另一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过于狭隘,一个对象在这种定义下只有被引用和没有引用两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望能描述这样一种对象,当内存空间足够时,则保留在当前内存中,当内存资源经过垃圾收集后,内存资源依旧...

孙应路的博客 152

java引用的概念

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

highwhite2009的专栏 577

java 抽象类 引用变量_JAVA中值传递和引用传递,抽象类,接口的概念

一、Java中的值传递和引用传递值传递:方法调用时,实际参数把它的值传递给形式参数,方法执行过程中形参的改变和实参的改变会不影响。这种传递是对于基础数据类型来说的。引用传递:也称为传地址。方法调用的时候,实际参数的引用(地址,而不是参数的值)被传递给方法中相应的形式参数,在方法执行中,对形式参数的操作实际上就是对于实际参数的操作,方法执行过程中形式参数的改变将会影响实际参数的值。二、1:抽象方法:...

weixin_42365898的博客 487

【JAVA】数组的概念;数组的使用;引用;内存分区;数组练习题

🍉内容专栏:【JAVA从0到入门】🍉本文脉络:数组的概念;数组的使用;引用;内存分区;数组练习题🍉本文作者:Melon_西西🍉发布时间 :2023.7.20目录1. 数组的基本概念数组:相同类型元素的一个集合。在内存中是一段连续的空间。

Catherine_77的博客 1287

容易误解的概念——Java中的值传递和引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?      答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。 Java参数,不管是原始类型还是引

艺术就是爆炸的专栏 624

Java中关于引用的概念澄清

Java当中的新的引用类型创建时,需要慎重赋值其他引用类型 例如已有引用类型int a[][] = {{1,4},{1,1}};System.out.println(a[0][0]);结果为1 而当创建一个新的引用类型int b[][] = a; 新的引用类型b并不会单纯复制a的内容而新建句柄,而是引用类型a和b共享相同的缓存区,其句柄相同,当对任意a或b进行修改时, 都会影响另一个引...

weixin_30265171的博客 101

java中四种引用的概念及应用场景

java中存在四种引用机制,分别是强引用,软引用,弱引用,虚引用强引用一般情况下我们用new方式创建的引用就是强引用,比如Client client = new Client()jvm进行GC的时候是不会回收存在强引用的对象的,比如Server server = new Server() Client client = new Client()当在第二行时jvm内存耗尽,jvm会报内存溢出的错误,...

sinat_22594643的博客 1965
上一篇: Java中Unsafe类
下一篇: Java垃圾回收机制理解一:垃圾回收算法
F_Hello_World
博客等级 码龄11年 38粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值