四种引用类型:强引用、软引用、弱引用、虚引用

JavaSE_第六篇:基本类型与引用类型 文章目录一、概述二、基本类型与引用类型2.1 基本类型2.2 引用类型2.2.1 三种引用类型2.2.2 enum枚举(特殊的类类型)2.2.3 String(特殊的引用类型)三、尾声 一、概述 Java中包括8种基本类型(9种包装类型,加一种Void)和3种引用类型(类、接口、数组,String是特殊的引用类型,enum枚举是特殊的类类型) 二、基本类型与引用类型 2.1 基本类型 基本类型 对应的包装类型(引用类型) 字节数 数值范围 默认值 boolean Boolean ------ 阅读详情

java中除了基本数据类型的变量(int、long等),剩下的都是引用类型的变量,一共有四种不同的引用类型。

一、强引用(Strong Reference)

强引用就是最常见的对某个对象的引用,如下代码变量o就是对所创建的Object对象的一个强引用。

Object o = new Object();

存在强引用的对象,不会被垃圾回收,即便发生了OutOfMemoryError,我们来看如下的测试代码:

/**
 * 这是一个大对象
 * @author 白吃的午餐
 *
 */
public class BigObject {
	private String name;
	private int[] a = new int[1024];

	public BigObject(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "BigObject [name=" + name + "]";
	}
}

public class StrongReferenceTest {

	public static void main(String[] args) {
		List<BigObject> bigs = new LinkedList<BigObject>();
		
		for(int i=0; i<1000; i++) {
			BigObject bo = new BigObject("BigObject_" + i);
			bigs.add(bo);
		}
	}

}

输出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.lizhihong.reference.BigObject.<init>(BigObject.java:5)
    at com.lizhihong.reference.StrongReferenceTest.main(StrongReferenceTest.java:12)

二、软引用(Soft Reference)

软引用是强度仅次于强引用的一种引用类型,当JVM认为内存不足时,会回收软引用所指向的对象

public class SoftReferenceTest {

	public static void main(String[] args) throws InterruptedException {
		List<Reference<BigObject>> bigs = new LinkedList<Reference<BigObject>>();
		
		ReferenceQueue<BigObject> rq = new ReferenceQueue<BigObject>();
		BigObject bo = new BigObject("BigObject");
		SoftReference<BigObject> sr = new SoftReference<BigObject>(bo, rq);
		bo = null;
		
		System.gc();
		//内存充足,对象不会被回收,仍然可以被获取到
		System.out.println(sr.get());
		
		//内存不足时,会回收软引用指向的对象,不会抛出OutOfMemoryError
		for(int i=0; i<1000; i++) {
			BigObject bo2 = new BigObject("BigObject_" + i);
			SoftReference<BigObject> sr2 = new SoftReference<BigObject>(bo2);
			bigs.add(sr2);
			bo = null;
		}
		
		//对象已经被回收,返回null
		System.out.println(sr.get());
	}
}

输出:

BigObject [name=BigObject]
null

三、弱引用(Weak Reference)

弱引用是强度次于强引用和软引用的一种引用类型,JVM每次GC时,都有可能回收弱引用指向的对象

public class WeakReferenceTest {

	public static void main(String[] args) {
		BigObject bo = new BigObject("BigObject_0");
		WeakReference<BigObject> wr = new WeakReference<BigObject>(bo);
		bo = null;
		System.gc();
		//与软引用不同,jvm每次gc时都有可能回收弱引用指向的对象,此处输出为null
		System.out.println(wr.get());
	}

}

输出

null

四、虚引用(Phantom Reference)

虚引用的概念比较难理解,你不能通过一个虚引用访问它指向的对象,PhantomReference的get方法永远返回null,仅仅是提供了对象被实际回收前做某些事情的机制,有点类似于finalize方法,但这个机制其实发生在finalize之后。

首先我们来澄清一个说法:虚引用是强度小于弱引用的一种引用类型

这个说法我个人觉得不完全正确,我们来看下面的这段代码会输出什么。如果虚引用是强度更弱的一种引用类型,下面这段代码应该不会报错,因为GC会正常回收虚引用指向的对象,就像软引用和弱引用一样,但实际执行的情况呢

public class PhantomReferenceTest1 {

	public static void main(String[] args) {
		List<Reference<BigObject>> bigs = new LinkedList<Reference<BigObject>>();
		ReferenceQueue<BigObject> rq = new ReferenceQueue<BigObject>();
		
		for(int i=0; i<1000; i++) {
			BigObject bo = new BigObject("BigObject_" + i);
			PhantomReference<BigObject> pr = new PhantomReference<BigObject>(bo, rq);
			bigs.add(pr);
			bo=null;
		}
	}
	
}

输出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.lizhihong.reference.BigObject.<init>(BigObject.java:10)
    at com.lizhihong.reference.PhantomReferenceTest1.main(PhantomReferenceTest1.java:16)

OutOfMemoryError,说明虚引用指向的对象并没有被回收,这是为什么?

下面来说说我的理解,如有错误的地方,还请大家指教

1、以弱引用类型举例(软引用类似),当我们创建一个弱引用的时候,最终会调用Reference如下的构造函数

private T referent;         /* Treated specially by GC */
    
Reference(T referent, ReferenceQueue<? super T> queue) {
        this.referent = referent;
        this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
    }

referent,分明就是一个强引用,它所指向的对象为什么会被回收呢

2、当JVM执行GC,回收弱引用所指向的对象时,实际上JVM会先把referent置为null,这样此前referent指向的对象就没有任何引用了,可以被JVM回收,实际情况正式这样的,我们来看下WeakReference的java doc说明

/**
 * Weak reference objects, which do not prevent their referents from being
 * made finalizable, finalized, and then reclaimed.  Weak references are most
 * often used to implement canonicalizing mappings.
 *
 * <p> Suppose that the garbage collector determines at a certain point in time
 * that an object is <a href="package-summary.html#reachability">weakly
 * reachable</a>.  At that time it will atomically clear all weak references to
 * that object
and all weak references to any other weakly-reachable objects
 * from which that object is reachable through a chain of strong and soft
 * references.  At the same time it will declare all of the formerly
 * weakly-reachable objects to be finalizable.  At the same time or at some
 * later time it will enqueue those newly-cleared weak references that are
 * registered with reference queues.
 *
 * @author   Mark Reinhold
 * @since    1.2
 */

3、为什么虚引用指向的对象没有被回收,同样我们查看PhantomReference的java doc说明

/**
 * Phantom reference objects, which are enqueued after the collector
 * determines that their referents may otherwise be reclaimed.  Phantom
 * references are most often used for scheduling pre-mortem cleanup actions in
 * a more flexible way than is possible with the Java finalization mechanism.
 *
 * <p> If the garbage collector determines at a certain point in time that the
 * referent of a phantom reference is <a
 * href="package-summary.html#reachability">phantom reachable</a>, then at that
 * time or at some later time it will enqueue the reference.
 *
 * <p> In order to ensure that a reclaimable object remains so, the referent of
 * a phantom reference may not be retrieved: The <code>get</code> method of a
 * phantom reference always returns <code>null</code>.
 *
 * <p> Unlike soft and weak references, phantom references are not
 * automatically cleared by the garbage collector as they are enqueued
.  An
 * object that is reachable via phantom references will remain so until all
 * such references are cleared or themselves become unreachable.
 *
 * @author   Mark Reinhold
 * @since    1.2
 */

4、虚引用指向的对象什么时候被回收,这取决于JVM

Rapid SCADA MQTT 一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau 阅读详情

相关推荐

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

JAVA基础 - 强引用、弱引用、软引用、虚引用

强引用:不会被回收; 软应用:内存不足时回收 弱引用:正常垃圾回收 虚引用:跟踪对象的正常垃圾回收 ...

zs1972551648的博客 1万+

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4811

一文彻底搞懂引用类型

array.splice(start 第一个参数为指定开始修改的位置,如果超出了数组的长度就从末尾开始添加内容,如果为负值,就从数组末尾开始的第几位,从1开始计数, deleteCount第二个参数为,要删除的元素的个数,是从start位置开始要删除的元素个数,为0时表示不删除元素,其后的参数为要加入的元素,从start位置开始,添加的元素。我相信你在学习时一定见到过Array类型,也是最常见的,数组的每一项可以存储任何类型的数据,数组的大小是可以动态变动的,数组的长度越大就可以存储更多的数据。

weixin_64051447的博客 3099

基于 Qt C++ 开发一套西门子量子测量系统的控制与数据采集平台

sensorIdCombo->addItems({"QTS-100-001 (温度)", "QPG-200-001 (压力)", "QDS-300-001 (位移)"});precisionTable->setHorizontalHeaderLabels({"传感器ID", "类型", "标称精度", "实际精度", "校准状态"});QWidget *dispWidget = createSensorWidget("量子位移", "mm (±1μm)", 50.0, 0.001);// 传感器状态更新。

寒寒豆豆软件公司的博客 253

RHCA II之路---EX442-10

这题比较耗时,可以多开2个窗口让他跑起来后先做后面的题目。

Q先生 582

强引用、软引用、弱引用、虚引用

如果不停的创建对象,总有一个时刻会占满内存空间,为了避免这种现象的发生,jvm会主动的将未使用的内存空间进行回收(GC)。java中基本数据类型分为两大类:1、基本数据类型;2、引用数据类型。JDK1.2中又将引用数据类型分为4类: 强引用、软引用、弱引用、虚引用,引入的目的是为了更好的管理内存空间。其中,FinalReference 被设计出来的目的是给 JVM 用的,这里暂时不学习。下面从强到弱学习四种引用类型。

qq_41163858的博客 3528

自抗扰控制(ADRC)理论与工程实践:8.1 自适应ADRC与参数在线整定

自适应自抗扰控制(AADRC)针对传统固定参数ADRC在动态变化系统中的局限性,提出通过在线调整关键参数(如观测器带宽ω₀、控制器带宽ω_c)以适应对象动态变化。主要方法包括基于稳定性理论的自适应律设计和基于性能指标的优化调节,前者保证闭环稳定但设计复杂,后者通过梯度搜索或模糊规则实现性能优化但缺乏严格稳定性证明。当前挑战在于非线性时变系统的稳定性分析、参数变化速率限制及工程实现的计算负担。AADRC拓展了ADRC在变参数系统(如无人机、软体机器人)中的应用,是迈向自主智能控制的关键技术。

技术工作者 214

什么是引用类型

但是需要注意的是,对于包装类型(如Integer、Float、Boolean等),虽然也属于对象类型,但由于Java提供的自动拆箱和装箱机制,它们也可以像基本数据类型一样使用。同时,在进行方法调用或者赋值操作时,也需要注意引用类型对象的浅拷贝与深拷贝等概念,确保不会在修改一个对象时影响到另一个对象。所谓“引用类型”,是指在使用该类型时,变量实际上存储的是该对象的引用地址而非对象本身。也就是说,使用引用类型定义一个变量时,变量本身只存储了指向对象内存空间的地址,而对象本身则被保存在内存的某个区域中。

m0_71461928的博客 1619

【YOLOv11改进[Backbone]】 使用Ghostnetv2替换Backbone

使用Ghostnetv2替换Backbone

静谧、淡雅 518

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3005

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

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

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

1、强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下: ...

没头脑遇到不高兴 4893

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

简单概括了Java的四种引用类型,以及部分应用场景。着重介绍了ThreadLocal中弱引用的使用

Z_juney的博客 1591

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝知此事要躬行。 Java中的四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。 Java为什么要设计这四种引用 Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。 Java设计这四种引用的主

LoveSummer 1662

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

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

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 8806

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

Java 的垃圾回收器机制 GC,GC 算是 Java 的一大特点,我们都知道 C 语言是不能自动释放内存的需要程序员去操作的,而 Java 自带的垃圾回收机制是能够帮助程序员自动释放内存的。GC:是Java自带的垃圾回收器,它是运行在独立的,优先级比较低的线程中,时刻都在检测与释放无用的内存,那是如何判断它是否有用,主要用的较多的判断方式就是引用计数。Java 执行 GC 判断对象是否存活有两种方式其中一种是引用计数。在 JDK 1.2 以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对

pan_junbiao的博客 562

Java中四种引用类型:强引用,软引用,弱引用,虚引用

四种引用类型 强引用(StrongReference) 弱引用(SoftReference) 软引用(WeakReference) 虚引用(PhantomReference) 强引用

gang_luo的博客 313

的引用_Java四种引用类型:强引用、软引用、弱引用、虚引用

作者:CodeBear的园子来源:www.cnblogs.com/CodeBear/p/12447554.htmlJava中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这...

weixin_39795479的博客 113

深入理解Java中的四种引用类型:强引用、软引用、弱引用和虚引用(附全代码解析)

这里写自定义目录标题一、关于引用二、 什么是GC三、强引用(Strongly Re-ference)四、软引用(Soft Reference)五、弱引用(Weak Reference)六、 虚引用(Phantom Reference)七、总结 一、关于引用 在JDK 1.2版之前,Java里面的引用是很传统的定义: 如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference数据是代表 某块内存、某个对象的引用。这种定义并没有什么不对,只是现在看来有些过于狭隘了。 在

qq_45251343的博客 1173

如何引用后端模糊搜索_Java 四种引用类型:强引用、软引用、弱引用、虚引用...

点击上方Java后端,选择设为星标优质文章,及时送达Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主要目的有两个:可以让程序员通过代码的方式来决定...

weixin_39921023的博客 91

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

Java四种引用类型 强引用(Strong Reference) 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。 当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。 软引用(Soft Reference) 软引用需要用 SoftReference 类来实现。 对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足

qq_40177015的博客 571

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

在Java中是由JVM负责内存的分配和回收,这是它的优点(简化编程者的工作,不需要像C语言那样去手动操作内存),但同时也是它的缺点(不够灵活,垃圾回收对于编程者来说是不可控的)。在JDK1.2以前,如果一个对象不被任何变量引用,则程序无法再次使用这个对象,这个对象最终会被GC(GabageCollection:垃圾回收)。但是如果之后可能还会用到这个对象,就只能去新建一个了,这其实就降低了JVM性...

weixin_39801165的博客 112

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

Java中的四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。 Java为什么要设计这四种引用 Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。 Java设计这四种引用的主要目的有两个: 可以让程序员通过代码的方式来决定某个对象的生命周期; 有利用垃圾回收。 强引用 强引用是最普遍的一种引用,我们写的代码,99.9999%都是强引用: Objecto.

zcm036200的博客 1029

Java提供的四种引用类型:强引用、软引用、弱引用、虚引用

目的:第一 是可以让程序员通过代码的方式决定某些对象的生命周期。 第二 是有利于JVM进行垃圾回收。 1、强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。 如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。 比如ArraryList类的clear方法中就是通过将引用赋值为null来实现清理工作的 此处是ArrayList的clear方法截图 在ArrayList类中定义了

qcm_myblogs111的博客 182
上一篇: MongoDB分片>集群组件>分片
下一篇: AKF扩展立方体
AscendentJava
博客等级 码龄17年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值