jvm中的引用类型

 Java中的引用类型


 

1.强引用

        一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的,所以被引用的对象A,就在GC Root的引用链上了。只要这一层关系存在,对象A就不会被垃圾回收器回收。所以只要方法不退出,局部变量就会保存当前对象A的地址,该对象就不会被回收。

    public static void main(String[] args) {ArrayList<Object> objects = new ArrayList<>();while (true) {//以下两行代码产生了两个引用关系,1.bytes变量 到 new byte[1024 * 1024]; 这个字节数组的引用关系,这也是一个强引用byte[] bytes = new byte[1024 * 1024];//2. objects集合对象 到 字节数组的关系,也是强引用objects.add(bytes);//每一轮while循环结束后,第一个引用关系就断开了。//但第二个引用关系没有断开!所以 bytes数组1mb大小的内存空间是不会被回收的。//这样就会导致每轮循环内存中增加1mb的数据,而且不能被回收}}

最后一次垃圾回收:回收前7873k,回收后7831k。回收前后内存差不多。说明有大量强引用在,而强引用不能被回收。最终内存不够用而报错。

2.软引用

        由于软引用允许垃圾回收器在内存不足时回收对象。所以软引用放的对象一般都不是很重要的对象,否则内存不足时,这个对象一被回收,某些核心数据就没了。主要应用场景在缓存里面。

    public static void main(String[] args) {ArrayList<SoftReference> objects = new ArrayList<>();for (int i = 0; i < 10; i++) {byte[] bytes = new byte[1024 * 1024];//软引用SoftReference<byte[]> softReference = new SoftReference<>(bytes);//将软引用对象放入集合中objects.add(softReference);System.out.println(i);}for (SoftReference softReference : objects) {//打印一下没有被回收的软引用System.out.println(softReference.get());}}

注:这里设置了堆内存10mb(由于还要其他强引用占用空间,所以存不下10个1mb的字节数组),且打印垃圾回收日志

说明:可以看到前七次没有进行垃圾回收,在到下标为6时,进行垃圾回收,这个时候就会把所有软引用对象全部回收,前七个对象没有了。最后再放入7-9三个字节数组对象。

最终打印集合:前七个为null(被回收了),只有后三个了。

注:这种机制很适合缓存,因为就算缓存中软引用的数据因为内存不足被回收了,也可以去数据库中查询数据。

3.弱引用

        弱引用的生命周期比软引用更短,无论内存是否充足,只要垃圾回收器开始工作,弱引用关联的对象都会被回收。弱引用适用于实现可以随时被回收的缓存数据,因为它不受内存状况的影响。

null
null
null
null
null
null
null
null
null
[B@4eec7777进程已结束,退出代码0

执行结果:前九个为空,最后一个由于强引用存在,没有被回收。

4.虚引用

        虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux shell编程学习笔记47:lsof命令

0 前言 今天国产电脑提示磁盘空间已耗尽&#xff0c;使用用df命令检查文件系统情况&#xff0c;发现/dev/sda2已使用100%。 Linux shell编程学习笔记39&#xff1a;df命令https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。 第一步是查看…

第二篇、SD真人视频转卡通动画 学习笔记

接着第一篇 2K转4K 生成玩卡通视频后&#xff0c;如何转换成更高分辨率的视频 1、将第一篇生成的工作目录下的output目录改成output-old&#xff0c;新建一个output目录 2、进入0&#xff0c;1子目录&#xff0c;把EbSynth生成的Outputxxx都删掉&#xff0c;frames和keys下…

IP5306 2.1A充电2.4 A放电电高集成度移动电源SOC IC,为移动电源提供完美电源解决方案

IP5306是一款集成升压转换器、锂电池充电管 理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动 电源提供完整的电源解决方案。 IP5306的高集成度与丰富功能&#xff0c;使其在应用时 仅需极少的外围器件&#xff0c;并有效减小整体方案的尺寸&#xff0c; 降低 BOM 成本…

Unity射击游戏开发教程:(5)使用 GetComponent 在 Unity 中进行脚本通信

我认为脚本通信是刚开始使用 Unity 时较难掌握的概念之一,我将继续讨论这个概念。在本文中,我将介绍如何在游戏对象发生碰撞时使用 GetComponent 来访问另一个脚本。 在这个游戏场景中,我有两个游戏对象,它们都有自己的脚本,需要进行通信。我们有玩家脚本和敌人脚本。Enem…

MP:There is no getter for property named ‘null‘ in ‘class XXX‘异常

在使用主键进行更新或者删除的时候&#xff0c;报下面错误 There is no getter for property named ‘null’ in class 。。。 代码如下 Builder Data public class Course implements Serializable {private static final long serialVersionUID -16929324809307129L;privat…

CC++的内存管理

C&C的内存管理 栈&#xff1a;即用即销毁 堆&#xff1a;有需求再申请空间&#xff0c;手动销毁 注意&#xff1a;const 修饰可以使变量有常性&#xff0c;但是变量存储的域与没有const修饰是相同的。 即&#xff1a; 在 main函数中&#xff0c; const int a 0; int b…

1个月,从估值3.5亿美元到卷款3000万,ZKasino做了什么?

项目rug跑路&#xff0c;对于加密圈的人而言&#xff0c;并不少见。 但rug得这么理直气壮&#xff0c;甚至在圈内掀起了一波对投资机构和KOL的口诛笔伐的项目&#xff0c;ZKasino&#xff0c;也算是头几个。 短短一个月时间&#xff0c;从估值3.5亿美元、众人吹捧的明星级项目&…

深入了解Redis内存淘汰策略中的LRU算法应用

LRU算法简析 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;算法是一种常见的内存淘汰策略&#xff0c;它根据数据的访问时间来决定哪些数据会被淘汰。LRU算法的核心思想是&#xff1a;最久未被访问的数据&#xff0c;被认为是最不常用的数据&#…

基于Tensorflow完成mnist数据集的数字手写体识别

基于Tensorflow完成mnist数据集的数字手写体识别 关于知识背景CNNFCNN 关于数据集新的改变 关于知识背景 CNN 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是一种具有局部连接、权值共享等特点的深层前馈神经网络&#xff08;Feed…

【大数据】LSM树,专为海量数据读写而生的数据结构

目录 1.什么是LSM树&#xff1f; 2.LSM树的落地实现 1.什么是LSM树&#xff1f; LSM树&#xff08;Log-Structured Merge Tree&#xff09;是一种专门针对大量写操作做了优化的数据存储结构&#xff0c;尤其适用于现代大规模数据处理系统&#xff0c;如NoSQL数据库&#xff…

缓解程序员工作压力的小窍门:从身心健康出发

随着信息技术的迅速发展&#xff0c;程序员成为了现代社会中不可或缺的一部分。然而&#xff0c;与之伴随而来的是高强度的工作压力&#xff0c;长时间的坐姿工作和快节奏的生活方式可能会对程序员的身心健康产生负面影响。因此&#xff0c;了解并采取有效的方法缓解工作压力对…

C# winform OpenProtocol中数据中的UI是什么类型?

C# winform OpenProtocol中数据中的UI是什么类型&#xff1f;

static在java中的详细用法

在Java中&#xff0c;static关键字可以用于以下几个方面&#xff1a; 静态变量&#xff08;类变量&#xff09;&#xff1a;使用static关键字修饰的成员变量被称为静态变量&#xff0c;也叫类变量。静态变量属于整个类&#xff0c;而不是具体的对象。静态变量在类加载时被初始…

vue2项目升级到vue3经历分享

依据vue官方文档&#xff0c;vue2在2023年12月31日终止维护。因此决定将原来的岁月云记账升级到vue3&#xff0c;预计工作量有点大&#xff0c;于是想着把过程记录下来。 原系统使用的技术栈 "dependencies": {"axios": "^0.21.1","babel-…

C++-DAY1

思维导图 有以下定义&#xff0c;说明哪些量可以改变哪些不可以改变&#xff1f; const char *p; const (char *) p; char *const p; const char* const p; char const *p; (char *) const p; char const* const p; const char *p&#xff1a;指针 p 所指向的内容不可改…

【嵌入式】Arduino IDE + ESP32开发环境配置

一 背景说明 最近想捣鼓一下ESP32的集成芯片&#xff0c;比较了一下&#xff0c;选择Arduino IDE并添加ESP32支持库的方式来开发&#xff0c;下面记录一下安装过程以及安装过程中遇到的坑。 二 下载准备 【1】Arduino IDE ESP32支持一键安装包&#xff08;非常推荐&#xff0…

学完stm32标准库后怎么快速入门hal库?单独学一下cubemx可以吗?还是ide?

原文&#xff1a;学完stm32标准库后怎么快速入门hal库&#xff1f;单独学一下cubemx可以吗&#xff1f;还是ide&#xff1f; - 知乎 (zhihu.com) 如果你已经学完stm32标准库了&#xff0c;那入门hal库是很容易的。 HAL库其实就是所谓的硬件抽象层库&#xff0c;它为开发者提供…

如何将web content项目导入idea并部署到tomcat

将Web Content项目导入IntelliJ IDEA并部署到Tomcat主要涉及以下几个步骤&#xff1a; 1. 导入Web Content项目 打开IntelliJ IDEA。选择“File” -> “New” -> “Project from Existing Sources…”。浏览到你的Web Content项目的文件夹&#xff0c;并选择它。Intell…

Spring的9个核心功能(一)

目录 资源管理 Java资源管理 1、来个Demo 2、原理 Spring资源管理 1、资源抽象 Resource WritableResource 2、资源加载 3、小结 环境 1、Environment 2、配置属性源PropertySource 3、SpringBoot是如何解析配置文件 类型转换 1、类型转换API …

C语言如何使⽤指针操作数组?

一、问题 指针到底该如何操作数组&#xff1f; 二、解答 实践和程序结果可以让我们产⽣疑问&#xff0c;但同时也是解决问题的重要依据&#xff0c;所以⾸先看 ⼀个演示程序。代码如下。 #include <stdio.h> int main() {int i, a[6] {19, 89, 2, 1, 12, 25};int *p …