黑马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详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...