java中的强软弱虚

Java中的对象引用 在这个示例中,我们首先创建了一个名为"john"的Person对象,并将其"name"属性设置为"John Doe"。在方法内部,我们通过引用修改了对象的"name"属性,将其改为"Jane Smith"。在上面的代码中,我们将"person"引用所指向的Person对象的"name"属性设置为"John Doe",然后通过引用打印出相应的问候语,并调用对象的"sayHello"方法。在上面的代码中,我们声明了一个名为"person"的引用,它的类型是Person。对象引用的声明和初始化。 阅读详情

在这里插入图片描述
在java中对象的引用有强、软、弱、虚四种,这些引用级别的区别主要体现在对象的生命周期、回收时机的不同。

准备工作

1. 设置内存

为方便调试,将内存设置为16MB

  1. 依次点击菜单栏的Run—>Edit Configurations

    在这里插入图片描述

  2. 点击 Modify options —> Add VM option
    在这里插入图片描述

  3. 添加参数
    我这里设置的内存是16m, 对应参数为 -Xms16m -Xmx16m
    在这里插入图片描述

2. 内存检测

使用 runtime.freeMemory() 的api,用来获取到未使用内存大小

强引用

这是最常见的引用,就是平时用的"=" 赋值,当将变量指向null时则表示去除了强引用,当触发gc时变量会被回收。

public static void main(String[] args) {
	Runtime runtime = Runtime.getRuntime();
	runtime.gc();
	System.out.println("创建数组前剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	byte[] bytes = new byte[10 * 1024 * 1024];
	System.out.println("创建数组后所用内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	System.gc();
	System.out.println("触发gc后所用内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	// 去除引用关系
	bytes = null;
	System.gc();
	System.out.println("去除引用关系后所用内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
}

打印结果:

创建数组前剩余内存:14.630088806152344MB
创建数组后所用内存:3.5891189575195312MB
触发gc后所用内存:3.6717300415039062MB
去除引用关系后所用内存:14.680328369140625MB

可以看出存在强引用关系时,即便触发gc该对象也不会被垃圾回收器回收

软引用

软引用引用的变量在gc时不会被回收,只有在内存不足时才会被回收。

public static void main(String[] args) {
	Runtime runtime = Runtime.getRuntime();
	runtime.gc();
	System.out.println("创建数组前剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	SoftReference<byte[]> softReference = new SoftReference<>(new byte[10 * 1024 * 1024]);
	System.out.println("添加软引用后剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	System.out.println("弱引用的引用对象:" + softReference.get());
	System.gc();
	System.out.println("触发gc后所用内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
	System.out.println("弱引用的引用对象:" + softReference.get());
	// 创建一个大于剩余内存的数组
	byte[] newBytes = new byte[(int) (runtime.freeMemory() + 1024)];
	System.out.println("弱引用的引用对象:" + softReference.get());

打印结果:

创建数组前剩余内存:14.631034851074219MB
添加软引用后剩余内存:3.5826187133789062MB
弱引用的引用对象:[B@5305068a
触发gc后所用内存:3.668914794921875MB
弱引用的引用对象:[B@5305068a
弱引用的引用对象:null

使用软引用时,触发gc对象不会被垃圾回收器回收,但当内存不足时,对象会被gc回收

弱引用

    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        runtime.gc();
        System.out.println("创建数组前剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
        WeakReference<byte[]> weakReference = new WeakReference<>(new byte[10 * 1024 * 1024]);
        System.out.println("添加弱引用后剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
        System.out.println("弱引用的引用对象:" + weakReference.get());
        System.gc();
        System.out.println("弱引用的引用对象:" + weakReference.get());
}

打印结果:

创建数组前剩余内存:14.731277465820312MB
添加弱引用后剩余内存:3.5902481079101562MB
弱引用的引用对象:[B@5305068a
弱引用的引用对象:null

弱引用在gc触发后就会回收对象

虚引用

虚引用的创建与软引用、弱引用不同,它需要传入一个引用队列

    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        runtime.gc();
        System.out.println("创建数组前剩余内存:" + runtime.freeMemory() / 1024.0 / 1024 + "MB");
        ReferenceQueue<byte[]> referenceQueue  = new ReferenceQueue<>();
        PhantomReference<byte[]> phantomReference = new PhantomReference<>(new byte[10 * 1024 * 1024], referenceQueue);
        new Thread(() -> {
            while (true) {
                PhantomReference<byte[]> poll = (PhantomReference<byte[]>) referenceQueue.poll();
                if (poll != null) {
                    System.out.println("虚引用对象被回收了");
                    break;
                }
            }
        }).start();
        System.out.println("gc前虚引用的引用对象:" + phantomReference.get());
        System.gc();
        System.out.println("gc后虚引用的引用对象:" + phantomReference.get());
    }

输出:

创建数组前剩余内存:14.730300903320312MB
gc前虚引用的引用对象:null
虚引用对象被回收了
gc后虚引用的引用对象:null

不能通过虚引用去使用对象,主要用于跟踪对象被垃圾回收器回收的状态。

AMEsim柱塞泵的建模学习 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、为什么要对柱塞泵进行仿真?二、Amesim中柱塞泵的模型1.amesim中自己的定排量五柱塞的斜盘柱塞泵2.压力、流量仿真总结 前言 最近在学习Amesim进行柱塞泵的仿真学习,顺便在这里记录我的学习过程,这是我的初衷 提示:以下是本篇文章正文内容,下面案例可供参考 一、为什么要对柱塞泵进行仿真? 柱塞泵是功能和动力学比较复杂的流体机械。而在实际实验中,往往没有条件或者需要对柱塞泵做一些优化,所以需要我们利用仿真... 阅读详情

相关推荐

SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)

SUMO安装环境的设置 目录一.SUMO下载的官方网址二.下载步骤:三.环境设置:1.打开设置环境变量的界面2.用户(Administrator)变量设置3.系统变量设置四.总述 一.SUMO下载的官方网址 sumo的下载地址: 二.下载步骤: 1.以sumo1.8.0为示例进行演示,点击下载地址; 2.选择Windows64位的安装版本,如下图所示: 3.点击对应版本会跳转到如下图所示的界面,等待几秒后会自动下载(温馨提示:请将下载路径提前设置好): 4.到目标存储路径下查看下载完成的SUMO(本

weixin_50632459的博客 1万+

(转)Java中的四种引用

强引用(Strong Reference) 强引用就是我们经常使用的引用,其写法如下 1 StringBuffer buffer = new StringBuffer(); 上面创建了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的操作(请原谅我这样的说法)。强引用最重...

weixin_30752377的博客 594

MCU工程迁移实战:从STM32到MSPM0L1306的完整指南

在嵌入式系统开发中,MCU工程迁移是开发者常面临的核心挑战,涉及从旧平台向新芯片的完整适配。其原理在于不同MCU在硬件架构、外设寄存器映射、时钟树及开发工具链上存在差异,迁移的本质是将应用逻辑与底层硬件实现解耦。这一过程的技术价值在于提升代码复用性、降低硬件切换成本,并确保产品能快速响应供应链或技术栈变化。典型应用场景包括产品升级换代、芯片缺货替代以及技术生态统一。本文以TI MSPM0L1306为例,详解如何通过对比清单分析、DriverLib API替换及分步调试,高效完成从STM32等平台到Arm C

weixin_27625589的博客 329

Java中的强软弱虚

    从JDK1.2版本开始,把对象引用分别四中级别,从而使程序能更加灵活的控制对象的生命周期,四中级别由高到低依次为:强引用、软引用、弱引用和虚引用。1、强引用:    比如 Object object=new Object(); new 创建出来的object 对象就是强引用。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,是程序异常终止,也不会靠随意回收具有强...

lxm20819的专栏 1179

ESP32连接PDM麦克风操作指南:新手入门必看

手把手教你如何将ESP32与PDM麦克风连接,采集音频数据并用于音频分类应用。内容涵盖硬件接线、代码配置及实际调试技巧,适合初学者快速上手esp32在声音识别场景中的使用。

weixin_42590539的博客 1329

Python开发MCP Client

全部例子只是MCP Client访问MCP Server的过程,那么这样其实就失去了MCP协议的创建的初衷,和大模型集成后才能发挥MCP最大的作用。

Criss@陈磊 2971

强软弱虚四种引用,看完不再犯迷糊

强引用、软引用、弱引用、虚引用这四个概念非常简单好记!用几个示例代码感受一下吧。

小白码上飞 4706

基于STM32L4XX、HAL库的YT8531C-CA以太网收发器(PHY)驱动程序设计

是一款由裕太微推出的高性价比、低功耗的单端口 10/100M 以太网物理层收发器(PHY)。它通过标准的 MII(介质独立接口)或 RMII(精简介质独立接口)与微控制器的 MAC 层连接,实现将数字信号与网络模拟信号之间的转换。支持自动协商(Auto-Negotiation),自动选择最高速率和双工模式。支持 HP Auto-MDIX(自动交叉直连),无需区分直通线或交叉线。低功耗设计,特别适合电池供电或对功耗敏感的 STM32L4 应用。支持 MII 和 RMII 接口,节省引脚(RMII模式)。

zhusl6688的博客 626

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

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

zs1972551648的博客 1万+

USB2.0协议解读

就写到这吧,其他协议层等属于软件需要了解的东西了。简单看了下,本文总结的有点乱,有两个原因吧,其一是理解的不够透彻,无法用简单明了的语言总结;其二是感觉这个协议文档章节划分的也不是很好,有点大杂烩。

qflook的博客 3673

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 639

Java中的强软弱虚引用

Java中的强软弱虚引用 强引用 强引用内存示意图: Java中最普遍的引用,比如有个A类,我们使用new关键字去创建A的实例的时候 A a = new A(); 栈中变量a指向堆中A的实例这个引用就是强引用。 public class TestForceReference { public static void main(String[] args) { A a = new A(); // 创建出A的实例对象,变量a指向堆中的A对象实例 System.out.p

weixin_44607702的博客 269

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

weixin_43567873的博客 296

Java中强软弱虚四种引用

Java中强软弱虚四种引用详解 文章目录Java中强软弱虚四种引用详解一、强引用二、软引用三、弱引用四、虚引用 强、软、弱、虚四种引用的引用强度逐渐减弱 一、强引用 默认的引用类型(99%以上的引用都是强引用),即类似 object o = new object() 这种引用关系 使用new操作符创建一个新的对象,并将其赋值给一个变量的时候,这个变量就成为指向该对象的一个强引用,这个对象成为被强引用的对象 如果被强引用的对象正在被直接或间接的引用着,这个对象就永远不会被垃圾回收(即使溢出也不回

立志成为一个前端、后端、测试全方位发展的程序员 1432

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

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

Java强软弱虚引用

强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。弱引用需要用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否够用,都会回收该对象占用的内存。创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动,

杀神lwz的博客 1320

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java中的引用:强软弱虚

前言 之前在研究MVP的时候接触过弱引用,用来避免由于Activity被回收导致的内存泄露,但是当时只是浅尝辄止,没有系统的去接触引用这一块,没想到最近在看ThreadLocal的时候又看到关于引用的东西了,于是干脆就把这一块的东西都整理一下。正文1,引用是什么每种语言都有自己的数据处理方式,比如在c或c++中我们经常使用指针来间接的操纵对象,而在Java中,操纵的标识符实际上是指向一个对象的“句柄”

lypeer的专栏 5773

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java强软弱虚

**对引用简单理解:Person p = new Person(); 其中 = 左边是引用,存在栈中; = 号右边是对象,在堆里。 引用整体架构图 四种引用特点 强引用:默认,即使OOM,JVM也不会GC这种引用,除非显示的赋值为 null 软引用:内存够,不收,内存不够,收。通常用在对内存敏感的程序中,例如:高速缓存。 弱引用:只要GC一运行,不管内存够不够,都收... ...

Lpy的博客 390

java中的强软弱虚_Java中的强软弱虚引用

Java中的类型引用强软弱虚强引用栈内存指向了堆内存public class MGCTest {public static void main(String[] args) {M m = new M();m = null;System.gc();}}复制代码当栈内存的m指向堆内存的new M(),当m=null是gc触发就会把new M()回收。软引用先示例/*** create by yangh...

weixin_30269201的博客 167

Java 强软弱虚引用

Java 强软弱虚引用 Java 根据对象的引用方式可以分为:强引用、软引用、弱引用、虚引用。 即 SoftReference、WeakReference、PhantomReference。 SoftReference、WeakReference、PhantomReference 位于 java.lang.ref 包,它们通常和 ReferenceQueue 一起使用。 强引用 强引用即对象的直接...

okclouderx的博客 307

Java 引用的强软弱虚

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

xiaotu的博客 179

java中的强软弱虚_Java中的强软弱虚四大引用

一、出现四种引用的原因在JDK1.2以前,Java中的引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义过于狭隘,在这种定义下一个对象只能有被引用或没有被引用两种状态,但我们希望能描述这样一类对象当内存空间还足够时,则能保留在内存中,如果内存空间在进行垃圾收集后还是非常紧张,则可抛弃这些对象。比如很多系统的缓存功能都符...

weixin_42467224的博客 253

java中的强软弱虚_java中的引用类型之强软弱虚详解

前言java中的引用类型共4种:强软弱虚,具体每种类型的特点和应用场景。记录下。本文是看了马士兵老师的视频后记录整理的。加深印象。基本概念1. 强引用强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。显式地设置M对象为null...

weixin_35437202的博客 321

浅谈Java中强软弱虚引用

浅谈Java中强软弱虚引用什么是强软弱虚引用?为什么要搞出来这四种引用?什么情况下可以用到这四种引用呢?本文主要探讨这三个问题!1基本概念强引用:在Java程序中通过调用构造器方法或者反射的方式创建出来的对象后通过一个引用指向它,并且在程序运行的过程中,可以通过引用链可以获取到这个对象,那么就可以说此处有一个强引用!比如如下两种情况:1)通过构造器创建对象后,有一个引用指向它//调用构造器创建对象...

weixin_38810239的博客 1201

java中的强软弱虚_java四种引用,强软弱虚 有大神在吗

展开全部Java中四种引32313133353236313431303231363533e58685e5aeb931333365633930用的特点:强引用(StrongReference)当我们使用 new 这个关键字创建对象时创建出来的对象就是强引用(new出来对象为强引用) 如Object obj = new Object() 这个obj就是一个强引用了,如果一个对象具有强引用。垃圾回...

weixin_39951378的博客 116

Java中的强软弱虚,你了解么?

为了充分利用计算机的内存,对象被设计成拥有生命周期。当对象的生命周期结束,会被垃圾回收器回收,从而释放内存资源。为了考虑回收的各种场景,在JDK1.2引用了强、软、弱、虚4种引用类型。 强引用 如果一个对象是强引用,那么垃圾回收器不会轻易回收它。只用当这个对象没有被使用,垃圾回收器才会回收它。 创建一个new StrongReference(),用一个引用strongReference去指向这块内存空间的地址,当引用置为null,垃圾回收器回收时,会出发finalize()方法。我们来看运行结

wujialv的博客 945
上一篇: JVM垃圾回收
得食猫
博客等级 码龄11年 50粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得食猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值