引用类型;强引用;软引用;弱引用和虚引用

news2024/11/24 1:04:41

概述

平时在编写代码的时候内存都是由jvm管理,对象的回收也是jvm在管理;
但是有些时候jvm无法回收对象,最后就会抛出oom异常.

那么那些回收不了的对象肯定有区别于能回收的对象;

先上一波引用类型介绍

强引用

比如平常我们直接new的对象,一个对象具有强引用,那垃圾回收器是不会去回收的,内存不足时就直接抛oom异常;强引用对象的回收一般要么手动set null,要么就是超出自己的生命周期,比如方法结束后,方法内new的变量就结束自己的生命周期了.
官方说法:一个方法的内部有一个强引用,这个引用保存在Java栈中,而真正的引用内容(Object)保存在Java堆中当这个方法运行完成后,就会退出方法栈则引用对象的引用数为0,这个对象会被回收

常见的ArrayListclear()就是手动赋值null

在这里插入图片描述

软引用(SoftReference)

如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

// 强引用
String strongReference = new String("abc");
// 软引用
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str);

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

软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是起通知作用,JVM什么时候扫描回收对象是JVM自己的状态决定的。就算扫描到软引用对象也不一定会回收它,只有内存不够的时候才会回收。

ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<>(str, referenceQueue);

str = null;
// Notify GC
System.gc();

System.out.println(softReference.get()); // abc

Reference<? extends String> reference = referenceQueue.poll();
System.out.println(reference); //null

当内存不足时,JVM首先将软引用中的对象引用置为null,然后通知垃圾回收器进行回收:

if(JVM内存不足) {
    // 将软引用中的对象引用置为null
    str = null;
    // 通知垃圾回收器进行回收
    System.gc();
}

垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象,而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的较新的软对象会被虚拟机尽可能保留;

比如浏览器回退时的内容获取就可以使用软引用

// 获取浏览器对象进行浏览
Browser browser = new Browser();
// 从后台程序加载浏览页面
BrowserPage page = browser.getPage();
// 将浏览完毕的页面置为软引用
SoftReference softReference = new SoftReference(page);

// 回退或者再次浏览此页面时
if(softReference.get() != null) {
    // 内存充足,还没有被回收器回收,直接获取缓存
    page = softReference.get();
} else {
    // 内存不足,软引用的对象已经回收
    page = browser.getPage();
    // 重新构建软引用
    softReference = new SoftReference(page);
}

弱引用(WeakReference)

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
str = null;

JVM首先将软引用中的对象引用置为null,然后通知垃圾回收器进行回收

str = null;
System.gc();

让一个弱引用再次变为一个强引用:

String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
// 弱引用转强引用
String strongReference = weakReference.get();

同样,弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

虚引用(PhantomReference)

虚引用顾名思义,就是形同虚设。与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。 虚引用与软引用和弱引用的一个区别在于:

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
// 创建虚引用,要求必须与一个引用队列关联
PhantomReference pr = new PhantomReference(str, queue);

参考了大佬的博文
https://juejin.cn/post/6844903665241686029

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

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

相关文章

Go进阶之rpc和grpc

文章目录 Go环境安装1&#xff09;windows2&#xff09;linux go语言编码规范1.1 包名&#xff1a;package1.2 ⽂件名1.3 结构体命名1.4 接⼝命名1.5 变量命名1.6 常量命名2.1 包注释2.2 结构&#xff08;接⼝&#xff09;注释2.3 函数&#xff08;⽅法&#xff09;注释2.4 代码…

三维变换与投影-计算机图形学

目录 三维变换与投影 三维变换原理 为什么C语言头文件要专门放在一个.h文件中呢&#xff1f; 斜投影原理 介绍一下什么是UGC 入口 透视投影 透视投影坐标系 三维变换与投影 三维变换原理 如何把三维物体投影到两维物体上 齐次坐标 加上一维&#xff0c;方便运算 …

chatGPT培训老师AIGC培训讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-6

以下为叶老师讲义分享&#xff1a; P25-P29 提示工程的模式 节省计算资源&#xff1a; 在微调过程中&#xff0c;不需要重新训练整个模型&#xff0c;因此可以节省计算资源。 提高特定任务上的性能&#xff1a; 通过微调&#xff0c;模型可以适应特定任务的语言特征和模式…

实时定位与路径优化:跑腿App系统开发中的地理信息技术

本文将介绍如何使用地理信息技术实现实时定位和路径优化功能&#xff0c;以提高跑腿服务的效率。 实时定位 用户位置获取 # 示例&#xff1a;获取用户的实时位置 def get_user_location(user_id):# 使用GPS或网络定位技术获取用户的地理坐标# 返回经度和纬度信息return lon…

随笔记录-springboot_ConfigFileApplicationListener

SimpleApplicationEventMulticaster、 BootstrapApplicationListener、ConfigFileApplicationListener 加载流程 SpringApplication#run(java.lang.Class<?>[], java.lang.String[]) SpringApplication#run(java.lang.String…) SpringApplication#prepareEnvironment…

竞赛选题 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

Pod控制器详解

目录 一、Pod控制器及其功用 二、Deployment控制器 三、StatefulSet控制器 四、DaemonSet控制器 五、Job控制器 六、CronJob 控制器 一、Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层…

DNS(Domain Name System) in detail

什么是 DNS&#xff1f; DNS&#xff08;域名系统&#xff09;为我们提供了一种与互联网上的设备进行通信的简单方法&#xff0c;而无需记住复数。就像每个房子都有一个唯一的地址来直接向它发送邮件一样&#xff0c;互联网上的每台计算机都有自己唯一的地址来与之通信&#xf…

Vue+OpenLayers 创建地图并显示鼠标所在经纬度

1、效果 2、创建地图 本文用的是高德地图 页面 <div class"map" id"map"></div><div id"mouse-position" class"position_coordinate"></div>初始化地图 var gaodeLayer new TileLayer({title: "高德地…

老李测评:网络电视盒子哪个好?双十一必看电视盒子推荐

大家好&#xff0c;我是测评人老李&#xff0c;双十一大促期间我们都在买买买&#xff0c;本期老李要分享的数码产品推荐是电视盒子&#xff0c;为了推荐更客观&#xff0c;老李购入了各平台热销的十几款电视盒子&#xff0c;通过两周的对比后&#xff0c;整理了这份电视盒子推…

Python中通过socketserver库创建服务端

socketserver库是Python的标准库&#xff0c;提供了套接字服务端的框架&#xff0c;通过该框架可以简化服务端的创建流程。 1 socketserver库的导入 通过如图1显示的代码导入socketserver库。 图1 导入socketserver库 2 通过socketserver库创建TCP服务端 通过socketserver库…

​轻量应用服务器是什么?和云服务器的区别有哪些

在当今快速发展的应用开发和网站建设领域&#xff0c;选择合适的服务器配置是一个相当重要的事。作为当前最优质的海外服务器服务商&#xff0c;现在也受到了越来越多用户的欢迎&#xff0c;而在近几年的服务器领域&#xff0c;轻量应用服务器是一个备受关注的服务器类型&#…

pg14-sql基础(二)-排序与条件

排序 SELECT employee_id, first_name, last_name, hire_date, salary FROM employees ORDER BY first_name; --按字母&#xff0c;默认升序 ORDER BY hire_date ASC; --升序 ORDER BY hire_date DESC; --降序SELECT employee_id, first_name, last_name, hire_date, salary F…

Redis系列-Redis数据类型【3】

目录 Redis系列-Redis数据类型【3】字符串类型&#xff08;String&#xff09;SDS (simple dynamic string) 哈希类型&#xff08;Hash&#xff09;列表类型&#xff08;List&#xff09;集合类型&#xff08;Set&#xff09;有序集合类型&#xff08;ZSet&#xff09;字符串类…

关于视频封装格式和视频编码格式的简介

文章目录 简介视频封装格式&#xff08;Video Container Format&#xff09;视频编码格式&#xff08;Video Compression Format&#xff09;两者关系总结webm 格式简介webm视频编码格式webm音频编码格式webm总结 简介 视频封装格式&#xff08;Video Container Format&#x…

Leetcode刷题详解——验证二叉搜索树

1. 题目链接&#xff1a;98. 验证二叉搜索树 2. 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所…

网安须知|什么是护网行动?什么是红蓝对抗?<文末有福利>

01 什么是护网行动 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中&#xff0c;公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全漏洞…

IC设计之《集成电路设计宝典》,共423页,可打印,快来领取吧~~~

集成电路&#xff08;integrated circuit&#xff09;是一种微型电子器件或部件。采用一定的工艺&#xff0c;把一个电路中所需的晶体管、电阻、电容和电感等元件及布线互连一起&#xff0c;制作在一小块或几小块半导体晶片或介质基片上&#xff0c;然后封装在一个管壳内&#…

com.alibaba:tools:jar com.alibaba:jconsole:jar

com.alibaba:tools:jar com.alibaba:jconsole:jar

Ubuntu20.04下Salome_meca 2022软件安装(支持GPU加速)

一、什么是Salome_meca &#xff1f; Salome_meca 是一个开源的有限元分析软件套件&#xff0c;主要用于模拟和分析复杂的力学问题。它是 Salome 平台的一部分&#xff0c;Salome 是一个通用的集成化软件环境&#xff0c;用于建模、预处理、模拟和后处理各种复杂的工程和科学问…