Java中“引用”的几种类型

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型 本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性 阅读详情

@转自:http://blog.youkuaiyun.com/fyxxq/article/details/51523870

强引用:无论内存是否足够,不会回收。

软引用:内存不足时,回收该引用关联的对象。

弱引用:垃圾回收时,无论内存是否足够,都会回收。

虚引用:任何时候都可能被垃圾回收器回收。


在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。

  从JavaSE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:

  1.强引用(StrongReference)

  强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:

1
2
Object object =  new  Object();
String str =  "hello" ;

  只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:

1
2
3
4
5
6
7
8
9
10
public  class  Main {
     public  static  void  main(String[] args) {
         new  Main().fun1();
     }
     
     public  void  fun1() {
         Object object =  new  Object();
         Object[] objArr =  new  Object[ 1000 ];
     }
}

  当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛出OOM(即OutOfMemory)错误也不会回收object指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。

  如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

  比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的:

复制代码
 /**
     * Removes the element at the specified position in this Vector.
     * Shifts any subsequent elements to the left (subtracts one from their
     * indices).  Returns the element that was removed from the Vector.
     *
     * @throws ArrayIndexOutOfBoundsException if the index is out of range
     *         ({@code index < 0 || index >= size()})
     * @param index the index of the element to be removed
     * @return element that was removed
     * @since 1.2
     */
    public synchronized E remove(int index) {
    modCount++;
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
    Object oldValue = elementData[index];

    int numMoved = elementCount - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                 numMoved);
    elementData[--elementCount] = null; // Let gc do its work

    return (E)oldValue;
    }
复制代码

  2.软引用(SoftReference)

  软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

  软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:

1
2
3
4
5
6
7
8
9
import  java.lang.ref.SoftReference;
 
public  class  Main {
     public  static  void  main(String[] args) {
         
         SoftReference<String> sr =  new  SoftReference<String>( new  String( "hello" ));
         System.out.println(sr.get());
     }
}

  3.弱引用(WeakReference)

  弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
import  java.lang.ref.WeakReference;
 
public  class  Main {
     public  static  void  main(String[] args) {
     
         WeakReference<String> sr =  new  WeakReference<String>( new  String( "hello" ));
         
         System.out.println(sr.get());
         System.gc();                 //通知JVM的gc进行垃圾回收
         System.out.println(sr.get());
     }
}
  第二个输出结果是null,这说明只要JVM进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。

  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

  4.虚引用(PhantomReference)

  虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

  要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

1
2
3
4
5
6
7
8
9
10
11
import  java.lang.ref.PhantomReference;
import  java.lang.ref.ReferenceQueue;
 
 
public  class  Main {
     public  static  void  main(String[] args) {
         ReferenceQueue<String> queue =  new  ReferenceQueue<String>();
         PhantomReference<String> pr =  new  PhantomReference<String>( new  String( "hello" ), queue);
         System.out.println(pr.get());
     }
}

二.进一步理解软引用和弱引用

  对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。

  在SoftReference类中,有三个方法,两个构造方法和一个get方法(WekReference类似):

  两个构造方法:

1
2
3
4
5
6
7
8
9
public  SoftReference(T referent) {
     super (referent);
     this .timestamp = clock;
     }
 
public  SoftReference(T referent, ReferenceQueue<?  super  T> q) {
     super (referent, q);
     this .timestamp = clock;
     }

  get方法用来获取与软引用关联的对象的引用,如果该对象被回收了,则返回null。

   在使用软引用和弱引用的时候,我们可以显示地通过System.gc()来通知JVM进行垃圾回收,但是要注意的是,虽然发出了通知,JVM不一定会立刻执行,也就是说这句是无法确保此时JVM一定会进行垃圾回收的。


Centos 7 Linux 安装单机 Hadoop(HDFS):下载、安装、配置、测试 本文详细介绍了在 CentOS 7 系统上安装与配置单机 Hadoop(HDFS)的完整流程,涵盖 JDK 环境准备、Hadoop 安装包下载与部署、核心配置文件(core-site.xml、hdfs-site.xml 等)修改、SSH 免密登录设置、HDFS 格式化及服务启动,并通过命令行与 Web 界面验证 HDFS 和 YARN 功能,适合 Hadoop 初学者快速搭建本地测试环境。 阅读详情

相关推荐

Pentaho安装与配置

Pentaho安装与配置前言一、下载二、配置1.JDK环境2.添加mysql-jdbc驱动三、启动 前言 Pentaho Data Integration (PDI):前身是Kettle。Pentaho提供了提取、转换和加载(ETL)功能,该功能使用统一且与最终用户和物联网技术相关且可访问的格式简化了捕获、清理和存储数据的过程。 功能:提供报表的制作、分析、仪表板、数据集成、数据采集、商业智能平台等强大功能。 一、下载 官网地址:http://www.pentaho.com/ 不过已经访问不到了

小太阳DENGJIE的博客 3613

JAVA的四种引用类型

Java四种引用类型1.引用的基本概念强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象...

义臻的博客 6635

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

深入JVM之Java引用类型

深入JVM之Java引用类型引用类型可以说是整个Java开发的灵魂所在,如果没有合理的引用操作,那么就有可能产生垃圾问题,但是对于引用也需要有一些合理化的设计。在很多的时候并不是所有的对象都需要被我们一直使用,那么就需要对引用的问题做进一步的思考。从JDK1.2之后关于引用提出了四种方案: ●强引用:当内存不足的时候,JVM宁可出现OutOfMemory错误停止,也需要进行保存,并且不会将此空间回

2022

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3907

SigmaStudio进阶技巧:如何用ADAU1701实现60段EQ与防啸叫算法

本文深入探讨了如何在ADAU1701 DSP芯片上实现专业级音频处理系统。通过精密的资源规划与架构设计,详细讲解了构建高达60段参数均衡器(EQ)的有效方法,并集成了移频与自适应陷波双策略的智能防啸叫算法。内容涵盖从SigmaStudio工程优化、算法模块组合到系统联调实战的全流程,旨在帮助中高级开发者充分利用ADAU1701性能,打造稳定、高效的音频处理解决方案。

weixin_28256233的博客 386

Java的四种引用类型

JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。 所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。...

CDConlyred的博客 984

全球、中国各省市县等行政区划(含十段线)shape及geosjon数据免费下载

免费下载全球、中国各省市县等行政区划(含十段线)shape及geosjon数据

mhf403445651的博客 3461

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存。C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存。这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题。一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配...

cpongo5 266

嵌入式NTC温度解算库:Steinhart-Hart定点实现与硬件解耦设计

NTC热敏电阻是嵌入式系统中最常用的模拟温度传感器,其阻值-温度关系高度非线性,需依赖Steinhart-Hart方程实现高精度转换。该方程通过三参数对数多项式建模,理论上可将误差控制在±0.1°C以内,但直接移植到MCU面临浮点开销大、定点溢出、系数精度损失等工程瓶颈。为此,归一化处理(ln(R/R₂₅))、Q24.8定点运算、查表+插值对数计算等优化技术成为资源受限场景下的关键技术路径。其核心价值在于将ADC采样与温度解算彻底解耦,适配各类HAL/裸机/RTOS环境,广泛应用于电池管理、工业PLC、Io

weixin_35756624的博客 647

【Pix4d精品教程】Pix4d中央子午线细化设置(测区跨两个分带)

本文介绍了在Pix4d软件中通过修改中央子午线设置来解决跨分带测区刺点问题的方法。针对测区跨3度分带(如105°和108°之间)时像控点与靶标点偏移较大的情况,建议将中央子午线设为测区中心(如106.5°)。具体操作步骤包括:修改投影文件中的中央子午线参数,选择新的输出坐标系配置文件。该方法能有效提高像控点刺点效率,为航测内业数据处理提供便利。操作简单实用,适合大比例尺测图项目中跨分带测区的数据处理需求。

智慧空间实验室 5527

java中引用数据类型有哪几种

如果这个映射之前包含了这个键的映射关系,那么旧的值将被指定的值替换(当且仅当,返回true,可以说映射M包含了键K的映射关系)。检查序列中的单个字符,比较字符串,搜索字符串,提取子字符串,创建一个字符串副本,其中所有字符都转换为大写或小写。每个类都使用Object作为它的超类,所有的对象(包括数组)都实现这个类的方法。注意:无论以哪种方式初始化数组,一旦初始化完成,数组的长度是固定的,除非重新初始化,否则不能更改。数组中的每一段数据称为一个数组元素,数组中的元素被编入索引以指示它们的存储位置。

fmz2222的博客 7102

YOLOv11涨点改进| CVPR 2026 | 全网独家首发、特征融合改进篇| 引入SRFusion 空间细化多级融合,含多种创新融合改进,涨点可直接发论文,适合裂缝图像检测,小目标检测任务高效涨点

🔥本文提出SRFusion空间细化多级融合模块,用于改进YOLOv11网络模型。该模块通过高分辨率特征引导低分辨率语义特征的融合,利用空间注意力机制对上采样后的特征进行加权细化,增强多尺度特征间的空间细节交互。SRFusion模块能够提升模型对目标区域的表达能力,有效改善小目标、密集目标及复杂背景场景下的检测效果,同时保持YOLOv11的高效性与实时检测性能。文章详细介绍了模块结构、实现原理、核心代码及在YOLOv11中的三种配置方法,为模型优化提供了创新解决方案。

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

JAVA中的引用四种引用类型

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

渣渣 8840

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

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

Java中的4种引用类型,你知道几种?

Java作为一门面向对象的编程语言,内存管理一直是程序员需要关注的重要方面。在Java中,垃圾回收机制负责自动管理内存,而引用类型则是垃圾回收的重要参考。本文将深入讨论Java中的四种引用类型:强引用、弱引用、软引用和虚引用,以及它们在内存管理中的应用和区别。

wcwmsj的博客 2162

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java引用类型有哪些

动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧: 1、Java中有哪几种引用?它们的含义和区...

weixin_40599844的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JAVA 中引用有几种类型?

在Java中,引用(Reference)是指向对象的指针。Java提供了几种不同“强度”的引用类型,它们对垃圾回收器的行为有不同的影响。这些引用类型包括强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。下面是对这几种引用类型的介绍。

Rubypyrrha的博客 388

Java 基础 —— Java 中的值类型与引用类型

一、值类型与引用类型 在 Java 中类型可分为两大类:值类型与引用类型。值类型就是基本数据类型(如 int、double 等),而引用类型是指除了基本的变量类型之外的所有类型(如通过 class 定义的类型)。所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失),基本的变量类型只有一块存储空间(分配在stack中),而引用类型有两块存储空间(一块在 stack 中,一块在 heap 中)。 什么是引用 引用其实就像是一个对象的名字或者别名

IT__learning的博客 4834

【Java】Java中的“引用类型”和C中的“指针”区别

文章目录前言1. Java中“基本数据类型”和“引用数据类型”变量在内存分配时的不同2. C中“指针”的特点3. Java中“引用”的特点4. Java的参数传递5.参考 前言 在学习Java中变量的数据类型时,发现其分为2大类:基本数据类型、引用数据类型。 其中,属于“引用数据类型”的有:String、数组、类、接口。 相比C语言,Java中的“引用数据类型”,和C语言中的“指针”比较相似,所以这里将两者进行对比分析。 1. Java中“基本数据类型”和“引用数据类型”变量在内存分配时的不同 对于“基本

chengwei1128的博客 5400

java对象引用类型有哪几种

引用类型 对象引用类型分为强引用、软引用、弱引用和虚引用 1、强引用 就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收 2、软引用 软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。 Obj

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 1551

java中引用类型和基本类型的区别

java中引用类型和基本类型的区别 一、数据类型 1.基本类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long、int、short、byte ②浮点类型:float、double ③字符类型:char ④布尔类型:boolean 2.引用类型: 引用数据类型非常多,大致包括:类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型。 简单来说,所有的非基本数据类型都是引用数据类型。 二、基本类型和引用数据类型的区别 1、存储位置 基本变量类型 在方法中定义的非全局基本数据类型变量的具体内容

m0_52415681的博客 8130

Java中对象的几种引用

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 在Java中对象的引用有如下四种: 1、强引用(StrongReference) 这是Java最常见的引用方式,创建一个对象,并把它赋给一个引用变量,程序通过该变量来操作实际的对象,当一个对象被其他引用变量引用...

孤云博客 4520

面试:Java有哪几种引用类型

Interviewer:你好,请先做一下自我介绍吧 applicant :interviewer 你好,俺叫小明,巴拉巴拉巴拉巴.... Interviewer :小明啊,那你说一下 Java有哪几种引用类型吧? applicant : 嗯啊...enenenenaaaa ???? Interviewer : 今天就到这吧,回家等通知吧! 下面我们就简单的回顾一下这个知识点。 Java在JDK1.2以后就将对象的引用分为:强、软、弱、虚四种引用类型,采用这几种引用方式,可以很灵活,便捷的控制对象

zuihongyan518的博客 1048

Java 有几种 有多少 引用类型/参考类型 枚举是不是类 类型

问题一: Java 中参考类型/引用类型有 几 种? 官方文档有两个答案: 3 , 4种 A:3 种:类类型、数组、接口; B:4种:类类型、数组、接口、类型变量; 网络部分观点: C:4种:类类型、数组、接口、枚举。 问题二:Java 枚举enum是否是类类型? 枚举是特殊的类类型 小结论 否定 C; 推荐A,即 3种:类类型、数组、接口

qingyuxx 1134

Java 引用类型分类详解

强引用是 Java 中最常见的引用类型,也是默认的引用类型。当我们通过new关键字创建一个对象并赋值给某个变量时,这个变量就是对该对象的强引用。在上述代码中,变量str是对字符串对象"Hello"的强引用。只要这个强引用存在,垃圾回收器(GC)就不会回收该对象。软引用是一种相对较弱的引用类型,用于指向一些不那么重要的对象。在内存足够时,软引用对象不会被回收;但如果 JVM 发现内存不足时,会尝试回收这些软引用对象以释放内存。要使用软引用,需要借助弱引用是一种比软引用更弱的引用类型。

m0_38053034的博客 2039

Java 中引用类型都有哪些

Java 中引用类型都有哪些 Java中对象的引用分为四种级别,这四种级别由高到低依次为:强引用、软引用、弱引用和虚 引用。 强引用( StrongReference) 如果一个对象被被人拥有强引用,那么垃圾回收器绝会回收它。当内存空间不足, Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意 回收具有强引用的对象来解决内存不足问题。 Java的对象是位...

newzhong 2694
上一篇: cmd命令
下一篇: 代理模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值