java中PhantomReference WeakReference SoftReference垃圾回收触发时机以及使用场景

java 中对象引用一般引用分为四种情况

强引用

即我们平常创建的对象

Object obj = new Object()

垃圾回收触发时机

在没设置 jvm 参数 -XX:PretenureSizeThreshold 和 -XX:MaxTenuringThreshold 的情况下

  • -XX:PretenureSizeThreshold 的值为 0,即未设置大对象直接晋升老年代的大小。
  • -XX:MaxTenuringThreshold 的值为 15,即新生代对象 gc 后达到此值让存活对象晋升到老年代。

一般对象都创建在 jvm 堆中的 Eden 区域中,如果创建对象时 Eden 区域不够,会触发 Minor GC,将 Eden 区域中不用的对象复制到 Survivor To 区域中。如果对象的年龄达到了15,则直接晋升到 Old 区域。如果 Old 区域区域满了,会触发 Full Gc,收集的数据是整个堆和方法区(元空间)中的内存。

使用场景

平时创建的对象都是这种

SoftReference(软引用)

SoftReference aSoftRef = new SoftReference(new Object());

垃圾回收触发时机

当内存不够时会触发

使用场景

一般用于缓存或者图片处理(一般图片占用大),触发 gc 后不会影响整个应用的操作。

WeakReference (弱引用)

WeakReference<Object>reference=new WeakReference<Object>(new Object());

垃圾回收触发时机

当内存回收时

使用场景

对象监视器

java 的 ThreadLocal

PhantomReference (虚引用、幽灵引用)

通过源码得知,创建的对象无法获取,即使用时间短

垃圾回收触发时机

在触发垃圾回收后,发现其他对象没有引用 PhantomReference 对象了,会添加到 Reference 的 pending 队列中,守护线程 ReferenceHandler 会对 pending 队列中的数据调用 Cleaner 的 clean() 间接调用 Runnable 的实现类的 run() 回收内存。

使用场景

数据库连接

mysql jdbc 中的 AbandonedConnectionCleanupThread 在 Connection 打开后忘记关闭会自动关闭网络连接。

频繁短时间内操作的小文件

java 中的 DirectByteBuffer,内部引用了 Cleaner(继承了 PhantomReference )。在触发垃圾回收后,发现其他对象没有引用 Cleaner 对象了,会添加到 Reference 的 pending 队列中,守护线程 ReferenceHandler 会对 pending 队列中的数据调用 Cleaner 的 clean() 间接调用 DirectByteBuffer 内部类 Deallocator 的  run() 方法回收内存。

对象池、内存池、监控器

总结

考虑到日常开发中创建的对象需要长时间存活的少,其实也可以使用 SoftReference 来实现,使用 WeakReference 在 gc 时就会被回收,即对象年龄为1,这样可能会造成正在运行的业务出现异常,但是 SoftReference 不会,只会在内存不够时才会触发 gc。

参考链接

https://baijiahao.baidu.com/s?id=1765962677589811767

https://www.jianshu.com/p/a87345395e80

https://www.jianshu.com/p/5020bd090497

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

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

相关文章

三巨头对决:深入了解pnpm、yarn与npm

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 三巨头对决&#xff1a;深入了解pnpm、yarn与npm 前言包管理器简介npm&#xff08;Node Package Manager&#xff09;&#xff1a;Yarn&#xff1a;pnpm&#xff08;Performant Npm&#xff09;&#…

Linux 服务器安全策略技巧:使用数字证书进行认证

什么是数字证书? 数字证书是一种用于验证和加密网络通信的安全工具。它是由认证机构(CA)颁发的一种电子文件,用于证明某个实体的身份。数字证书包含了实体的公钥和其他相关信息,可以用于验证实体的身份和确保通信的机密性。 为什么使用数字证书进行认证? 在Linux服务器…

基于Mapify的在线艺术地图设计

地图是传递空间信息的有效载体&#xff0c;更加美观、生动的地图产品也是我们追求目标。 那么&#xff0c;我们如何才能制出如下图所示这样一幅艺术性较高的地图呢&#xff1f;今天我们来一探究竟吧&#xff01; 按照惯例&#xff0c;现将网址给出&#xff1a; https://www.m…

微信小程序实现一个天气预报应用程序

微信小程序实现一个天气预报应用程序 第一步创建一个项目第二步项目目录下找到 pages/index/index.wxml 文件第三步在 pages/index/index.wxss 文件中写入样式第四步在 pages/index/index.js 文件中添加以下代码项目简介 第一步创建一个项目 第二步项目目录下找到 pages/index…

在 Python 中编写循环Loops的艺术

在 Python 中编写循环Loops的艺术(The Art of Writing Loops in Python) 文章目录 在 Python 中编写循环Loops的艺术(The Art of Writing Loops in Python)一次获取索引Indexes和值Values通过 Product 函数避免嵌套循环Nested Loops使用 Itertools 模块编写花式循环进行无限循环…

SpringBoot知识

1、Spring和SpringBoot对比 2、版本调整 &#xff08;1&#xff09;先排除是否是JDK与SpringBoot的版本不一致导致的&#xff1a;如JDK1.8和SpringBoot3.1.5冲突&#xff1b; &#xff08;2&#xff09;调整编译版本 &#xff08;3&#xff09;调整maven的jdk &#xff08;4&…

Vscode运行调试文件

文章目录 vscode调试运行流程vscode 执行报错settings.json成功截图 vscode调试运行流程 vscode左侧菜单栏点击运行调试icon&#xff0c;点击菜单右侧栏运行和调试按钮&#xff0c;选择node调试器&#xff0c;js文件行数左边点击添加红色断点&#xff0c;运行当前文件 vscode…

【docker实战】01 Linux上docker的安装

Docker CE是免费的Docker产品的新名称&#xff0c;Docker CE包含了完整的Docker平台&#xff0c;非常适合开发人员和运维团队构建容器APP。 Ubuntu 14.04/16.04&#xff08;使用 apt-get 进行安装&#xff09; # step 1: 安装必要的一些系统工具 sudo apt-get update sudo ap…

湘潭大学-2023年下学期-c语言-作业0x0a-综合1

A 求最小公倍数 #include<stdio.h>int gcd(int a,int b) {return b>0?gcd(b,a%b):a; }int main() {int a,b;while(~scanf("%d%d",&a,&b)){if(a0&&b0) break;printf("%d\n",a*b/gcd(a,b));}return 0; }记住最大公约数的函数&…

gitee上的vue大屏项目

在 Gitee 上,有几个值得注意的 Vue 大屏项目:vue-big-screen-plugin (Gitee): 这是一个基于 Vue3、Typescript、DataV 和 ECharts5 框架的可视化大屏项目。它使用 .vue 和 .tsx 文件构建界面,并采用新版动态屏幕适配方案。这个项目支持数据的动态刷新渲染,内部的 DataV 和 …

linux 网络系统管理 技能大赛 mail赛题配置

比赛 Postfix sdskill.org 的邮件发送服务器 支持smtps(465)协议连接&#xff0c;使用Rserver颁发的证书,证书路径/CA/cacert.pem; 创建邮箱账户“user1~user99”&#xff08;共99个用户&#xff09;&#xff0c;密码为Chinaskill20! Dovecot sdskill.org 的邮件接收服务…

如何编写一个javaAgent jar工具包超详细教程

介绍 Java Agent技术 Java Agent技术是JDK提供的用来编写Java工具的技术&#xff0c;使用这种技术生成一种特殊的jar包&#xff0c;这种jar包可以让Java程序 运行其中的代码。 Java Agent技术的两种模式 Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码…

【机组期末速成】CPU的结构与功能|CPU结构|指令周期概述|指令流水线|中断系统

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 前言&#xff1a; 最近在备战期末考试&#xff0c;所以本专栏主要是为了备战期末计算机组成原理这门考试&#xff0c;讲的比较浅显&…

Unity 关于json数据的解析方式(LitJson.dll插件)

关于json数据的解析方式&#xff08;LitJson.dll插件&#xff09; void ParseItemJson(){TextAsset itemText Resources.Load<TextAsset>("Items");//读取Resources中Items文件&#xff0c;需要将Items文件放到Resources文件夹中string itemJson itemText.te…

Flink实时电商数仓(八)

用户域登录各窗口汇总表 主要任务&#xff1a;从kafka页面日志主题读取数据&#xff0c;统计 七日回流用户&#xff1a;之前活跃的用户&#xff0c;有一段时间不活跃了&#xff0c;之后又开始活跃&#xff0c;称为回流用户当日独立用户数&#xff1a;同一个用户当天重复登录&a…

详解Keras3.0 Layer API: Dropout layer

Dropout layer 图1 标准的神经网络 图2 加了Dropout临时删除部分神经元 Dropout层的作用是在神经网络中引入正则化&#xff0c;以防止过拟合。它通过随机丢弃一部分神经元&#xff08;如图2&#xff09;的输出来减少模型对训练数据的依赖性。这样可以提高模型的泛化能力&#x…

西安电子科技大学现代密码学实验四报告

实验题目&#xff08;中文&#xff09;&#xff1a; RSA大礼包&#xff08;密码挑战赛赛题三&#xff09; 实验摘要&#xff08;中文&#xff09;&#xff1a; 本实验针对一个RSA加解密软件的加密数据进行了分析和破解。实验包括了对加密数据的截获以及尝试恢复RSA体制的相关信…

C++初阶——基础知识(函数重载与引用)

目录 1.命名冲突 2.命名空间 3.缺省参数 4.函数重载 1.函数重载的特点包括&#xff1a; 2.函数重载的好处包括&#xff1a; 3.引用 引用的特点包括 引用的主要用途包括 引用和指针 引用 指针 类域 命名空间域 局部域 全局域 第一个关键字 命名冲突 同一个项目之间冲…

[原创][R语言]股票分析实战[5]:加载股票数据

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

二分查找--二分查找算法(朴素二分模板)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题题目链接https://leetcode.cn/problems/binary-search/description/ 算法原理 二段性&#xff0c;我们发现这个数组可以找到某种规律将其分为两段&#xff0c;不断划分下去&#xff0c;最终可以找到target 图示 我们分…