黑马JVM总结(十二)
(1)五种引用_强软弱

实线箭头表示强引用,虚心线表示软弱虚终结器引用

在平时我们用的引用,基本都为强引用 ,比如说创建一个对象通过=运算符赋值给了一个变量,那么这个变量呢就强引用了刚刚的对象
强引用的特点:通过GC Root的引用链, 能够找到它,他就不会被垃圾回收
C对象 (GC Root)通过引用链可以找到A1对象,那么它不能回收的
B对象 (GC Root)通过引用链可以找到A1对象,那么A1它不能回收的
只有GC Root对它的引用都断开时,它才能被垃圾回收
软 弱引用:只要A2和A3这两个对象没有被直接的强引用所引用,那么当垃圾回收时,都可能被回收掉

当发生了垃圾回收,回收完发现内存不够,那么他会把软引用所引用的这个A2对象回收掉
当发生了垃圾回收,不管是不是内存充足,都会把弱引用所引用的A3对象回收掉
软引用可以配合一个引用队列:
当软引用的对象被回收掉之后软引用自身也是一个对象,在创爱时分配了一个引用队列,当它所引用的对象被回收时软引用就会进入这个队列,弱引用也是如此
为什么做这样的一个处理呢?因为软引用或者弱引用也好他们自身也用占用一定的内存,如果想把他们两个占用的内存做进一步的释放需要使用这个引用队列找到他们,然后作进一步的处理

(2)五种引用_虚引用和终结器引用
虚引用和终结器引用必须配合引用队列来使用,也就是说当虚引用创建的时候关联一个引用对列,当终结器引用创建的时候也会关联一个引用对列

当创建ByteBuffer对象时会创建一个名为Cleaner的虚引用对象,ByteBuffer会分配一块直接内存,会把直接内存地址传递给虚引用对象,当ByteBuffer以后没有别强引用后,他自己可以别垃圾回收掉了,但是它分配的那个直接内存并不能被java垃圾回收所管理,所以当ByteBuffer别回收的时候,让虚引用对象进入引用队列

引用队列会有一个referencrHandler的线程去这个队列里找有没有一个新入队的Cleaner,如果有的haul会调用Cleaner中的方法clean(),根据前面记录的直接内存的地址,调用Unsafe的freeMemary()方法释放掉直接内存,这样就会保证直接内存导致的内存泄露

我们知道所有的对象都会继承于Object对象父类,Object里面都会有一个finallize()方法,一个终结方法,当我这个对象重写了终结方法,并没有强引用B对象,那么它可以当成垃圾进行回收,那么这个终结方法在什么时候调用呢?那就是靠的终结器引用达到这个目的,当没有强引用我的这个对象时,对象会由虚拟机帮我们创建它对应的终结器引用,当这个对象A4被垃圾回收时把终结器引用也加入引用队列,再由一个优先级很低的一个线程在某个时机去这个引用队列是不是有终结器引用,有的话会找到我们要作为垃圾回收的这个对象并且调用它的finallize方法,等调用完了,等下一次垃圾回收时就可以回收掉了

finallize工作效率还是很低,第一次回收时不能把它回收掉,需要先把终结器引用入队,那个检查线程优先级很低,可能造成这个对象的finallize方法迟迟不能调用这个对象占用的内存也迟迟不能释放,索引我们不推荐使用finallize去释放资源的一个理由

(3)软引用_应用


设置堆聂村大小20兆

我们这往List集合里面循环放4个字节的数组,比如说放4byte的图片,由于图片的数量过多,我们用强引用来引用这个图片资源,就会导致下面的内存溢出的错误,这些不重要的资源,能不能在内存紧张时,把它占用的内存释放掉,以后用到这个图片我再读取一下不就行了嘛,就不是使用给这个强引用场景了需要使用弱引用


我们不使用List直接去引用Byte数组啦,他们之间加了一个SoftRerence软引用对象,软引用对象呢再间接引用Byte数组,

现在List和SoftRerence之间是强引用,SoftRerence和Byte数组是一个软引用了

加上垃圾回收的虚拟机参数:

循环5次并没有发生内存的溢出,但是在最后再一次循环数组发现只有最优一个有数据,前面几个都被回收掉了,只有最后一个保留了下来
在第三次循环时内存已经很紧张了,触发了一次垃圾回收 ,第四次循环,发现还是不够又触发了一次MinarGC回收效率不高又触发了一次Full GC,还是没有回收多少,然后触发了软连接的垃圾回收,一次垃圾回收后如果空间还是不够他就把软连接引用的对象释放掉,这次垃圾回收之后我们发现新生代和老年代都得到巨大回收,代价呢呢吧前四次的对象都回收掉了,只要最后一个放了进去
新生代占77%,老年代占7%

相关文章:
黑马JVM总结(十二)
(1)五种引用_强软弱 实线箭头表示强引用,虚心线表示软弱虚终结器引用 在平时我们用的引用,基本都为强引用 ,比如说创建一个对象通过运算符赋值给了一个变量,那么这个变量呢就强引用了刚刚的对象 强引用的…...
彻底搞懂线程池原理以及创建方式
1. 为什么要使用线程池 在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处: 降低资源消耗。通过复用…...
FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地
FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关的SIP中继8、设置FXO网关呼叫…...
Oracle数据如何迁移导入到MySQL
使用Navicat工具建立数据连接,进行数据传输 1、打开Navicat工具,分别连接Oracle数据库和MySQL数据库。 2、连接源选择你的oracle数据,目标选mysql 即可成功导入...
卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-1
目录 前言数学理论推导1. 递归算法2. 数学基础结语参考 前言 最近项目需求涉及到目标跟踪部分,准备从 DeepSORT 多目标跟踪算法入手。DeepSORT 中涉及的内容有点多,以前也就对其进行了简单的了解,但是真正去做发现总是存在这样或者那样的困惑…...
Linux 文件创建、查看
touch、cat、more命令 ①touch命令——创建文件 ②cat命令——查看文件内容全部显示 这是txt.txt文件内容 使用cat命令查看 ③more命令——查看文件内容支持翻页 在查看的过程中,通过空格翻页,通过q退出查看...
WPF 如何让xmal的属性换行显示 格式化
WPF 如何让UI的xmal 按照下面的格式化显示 首先格式化显示在VS中的快捷键是 Ctrl KD 然后需要配置,工具 选项 -文本编辑器 -xmal -格式化-间距 更改成如下就可以了...
Linux学习之MySQL主从复制
MySQL配置一主一从 环境准备: 两台服务器: Master:192.168.88.53,Slave:192.168.88.54 在两台服务器上安装mysql-server # 配置主服务器192.168.88.53 # 启用binlog日志 [rootmysql53 ~]# yum -y install mysql-ser…...
【JavaSE笔记】抽象类与接口
一、抽象类 1、概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 package demo2…...
详谈操作系统中的内核态和用户态
不知道大家有没有思考过这样一个问题:什么是处理器(CPU)的状态?🤔 其实CPU和人一样,没有执行程序的时候,是没有什么状态的,当它执行的程序是用户程序的时候就叫用户态,当执行的程序是操作系统的代码时就叫系统态或者内…...
OpenWrt KernelPackage分析
一. 前言 KernelPackage是OpenWrt用来编译内核模块的函数,其实KernelPackage后面会调用BuildPackage,这里会一块将BuildPackage也顺便分析,本文以gpio-button-hotplug驱动模块为例,讲解整个编译过程。 gpio-button-hotplug驱动编译…...
第 363 场 LeetCode 周赛题解
A 计算 K 置位下标对应元素的和 模拟 class Solution { public:int pop_cnt(int x) {//求x的二进制表示中的1的位数int res 0;for (; x; x >> 1)if (x & 1)res;return res;}int sumIndicesWithKSetBits(vector<int> &nums, int k) {int res 0;for (int i…...
ffplay源码解析-main入口函数
main入口函数 初始化 变量、缓存区、SDL窗口初始化等 int main(int argc, char **argv) {int flags;VideoState *is; // av_log_set_level(AV_LOG_TRACE);init_dynload();av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);/// av_log_set_le…...
这些Coding套路你不会还不知道吧?
对于一名程序员来说,编码进阶是成为优秀工程师非常重要的一步,它可以让我们更加熟练地掌握编程,深入理解数据结构和算法,从而更好地完成复杂的任务,提高工作效率。而我认为熟练使用设计模式就是编码进阶的最好方式之一…...
Spring Boot深度解析:快速开发的秘密
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
mysql数据库备份(mysqldump)
mysqldump命令备份数据 mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sqlmysqldump常用操作示例 1. 备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/mysqlbackup/mydb.sql2. 备份全部数据库的结构(加 -d 参数) …...
linux Nginx+Tomcat负载均衡、动静分离
linux NginxTomcat负载均衡、动静分离 1、Tomcat的基本介绍1.1Tomcat是什么?1.2Tomcat的构成组件1.3Tomcat的核心功能1.4Tomcat请求过程 2、Tomcat部署2.1安装tomcat2.2优化tomcat启动速度2.4主要目录说明 3、Tomcat 虚拟主机配置3.1创建fsj和mws项目目录和文件3.2修…...
ts 枚举类型原理及其应用详解
ts 枚举类型介绍 TypeScript的枚举类型是一种特殊的数据类型,它允许开发者为一组相关值定义一个共同的名称,使我们可以更清晰、更一致地使用这些值。 枚举类型在TypeScript中用enum关键字定义,每个枚举值默认都是数字类型,从0开…...
腾讯mini项目-【指标监控服务重构】2023-08-23
今日已办 进度和问题汇总 请求合并 feature/venus tracefeature/venus metricfeature/profile-otel-baserunner-stylebugfix/profile-logger-Syncfeature/profile_otelclient_enable_config 完成otel 开关 trace-采样metrice-reader 已经都在各自服务器运行,并接入…...
C- ssize_t size_t
size_t 和 ssize_t 都是在 C 和 C 的标准库中定义的数据类型,它们通常用于表示大小和长度。然而,它们有关键的区别。 size_t: 定义:size_t 是一个无符号整数类型,它是适合表示对象的大小的类型。在 POSIX 中,它也用于…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
