Java中引用的概念

ESP32-IDF开发实例-外部Flash与FatFs文件系统数据存取 FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,并且与磁盘I/O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。ESP32-IDF对FatFs提供了良好的支持。 阅读详情

序言:

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

    }
}

测试结果:

2025_NIPS_Grounded Reinforcement Learning for Visual Reasoning 尽管基于思维链的强化学习已在数学、编程等任务中显著提升语言模型性能,但视觉推理面临额外复杂性——需模型引导视觉注意力、解读感知输入,并将抽象推理锚定到空间证据上。本文提出ViGoRL(视觉接地强化学习),这是一种通过强化学习训练的视觉语言模型,能将每个推理步骤明确锚定到特定视觉坐标。受人类视觉决策启发,ViGoRL学会生成空间接地的推理轨迹,在每个步骤引导视觉注意力聚焦任务相关区域。当需要细粒度探索时,我们提出的多轮强化学习框架允许模型随着推理展开动态缩放至预测坐标。 阅读详情

相关推荐

从零配置XDMA:手把手教你PCIe BAR与AXI总线的地址转换(基于Vivado2023)

本文基于Vivado2023,手把手教你配置XDMA IP核,深入解析PCIe BAR与AXI总线地址转换的核心原理。通过实战步骤,详细说明如何正确设置BAR参数(如32/64位、预取使能)及地址映射,确保主机能稳定访问FPGA侧寄存器与内存,是解决PCIe通信调试难题的关键指南。

2w3e4r5t6y的博客 1213

全面讲解Java引用

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

shaomingmin的博客 2594

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 675

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

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3564

FSMC驱动LCD显示屏学习2

液晶显示器,简称 LCD(Liquid Crystal Display)相对于上一代 CRT 显示器 (阴极射线管显示器),LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分 子排列却和固体晶体一样非常规则,因此取名液晶。

usjjjsj的博客 1695

java引用详解

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

2401_84024148的博客 2445

MTK Linux DRM分析(十一)- MTK KMS Panel显示屏驱动

面板扩展(Panel Extension)是指 MediaTek 在标准 DRM 面板驱动框架之上添加的定制化功能模块。

iTom1900 1687

区分java_Java中四种引用的区分

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

weixin_34723270的博客 259

Higress 入门:初探阿里云原生 AI 网关

Higress 是一款由阿里巴巴推出的云原生 API 网关,其内核基于 Istio 和 Envoy。与传统 API 网关不同,它深度聚焦于 AI 场景,支持国内外众多主流模型供应商,如 OpenAI、百度文心一言等,还兼容基于 vllm/ollama 等自建的 DeepSeek 模型,能够满足不同类型企业对 AI 能力集成与管理的需求。Higress 作为一款功能强大的云原生 API 网关,在 AI 时代展现出独特的优势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1866

【知识分享】车载以太网PCB布局设计指南

本文将深入探讨在设计车载以太网设备的印刷电路板(PCB)时需要着重考虑的若干关键主题。这些主题广泛涵盖了数据布线设计,以确保其符合信号完整性(SI)和电磁兼容性(EMC)标准;外部元器件的合理摆放;以及采取有效的抗电磁干扰(EMI)布局策略等方面。通过全面且细致地处理这些关键环节,能够显著提升车载以太网设备的性能与可靠性。

一只豌豆象的博客 1352

Java中对象引用是什么意思

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

weixin_53850894的博客 670

实现敌人跟随玩家。(Unity)

首先和玩家设置一模一样,给敌人添加一个刚体,设置一个碰撞器,并设置一个触发器。然后在对场景里面的组件添加导航网格代理并且进行bake烘焙,那样的话敌人就可以在进行烘焙的位置进行移动。创建脚本,并且挂载脚本到敌人的组件上,用代码进行实现效果,并且要挂载目标对象。

weixin_57813136的博客 1869

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

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

weixin_36176188的博客 227

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

Java中引用和对象的概念

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

weixin_52326703的博客 997

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

u012151345的博客 632

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 map 引用传递参数_Java中值传递和引用传递的概念

很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段:1 if (qmi >= 0) {2   decodeParms(uri.substring(qmi + 1), parms);3uri = decodePercent(uri.substring(0, qmi));4 }1 /**2 * Decodes parameters in percent...

weixin_39894233的博客 971
上一篇: 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、付费专栏及课程。

余额充值