黑马JVM总结(十三)

news2024/12/23 18:11:42

(1)软引用_引用队列

上面我们们使用软引用我们发现在内存不足时,会把软引用对应的Byte数组对象,进行一个释放,但是我们发现遍历lIst集合的时候一些软引用的对象已经是null了,这些没必要在把它们保存到List集合中了有效的只有最后一个,遇到这种情况呢,我们希望把软引用也做一个清理  从List集合中清除掉,软引用本身也是占用内存的,只是占用比较少这种null的这种没必要保存了 

怎么实现清理无用的软引用呢?需要配合一个引用队列来实现软引用的清理

queue.pool获取到放入队列的软引用对象

 发现现在已经移出另外无用的软引用,List只剩下一个byte数组了

(2)弱引用

弱引用:List集合不直接引用byte数组对象,而是引用WeakReference然后再通过WeakReference 间接应用byte数组对象

这样呢当内存不足时会把把WeakReference所引用的byte数组所占用的内存释放掉 ,从而避免强引用导致的内存溢出问题

前三次没有问题,第四次触发了一次垃圾回收,但是没有回收掉前面的对象,第五次又触发一次垃圾回收,把第四个回收为null了,第五个才能放进去 

修改多一次循环,第六次做一个垃圾回收,把第五个对象 变为null,第六个才能放进去

修改为10:第九次的时候,加第九个的时候把第八个变为null,相当于内存中只包含四个对象4*4=16差不多20兆

在放第十个的时候,弱引用也有一定的内存,放第十个的时候放不下啦导致了一次Full GC前面引用的byte数组全部清除掉了,只剩下最后一个

通过这个例子弱引用一般在垃圾回收时把一些弱引用对象它所占用的内存释放掉,同时弱引用自身占用的内存要释放也要配合引用队列来释放跟软引用非常的类似

(3)回收算法_标记清除

垃圾回收算法:之前呢我们学过这个对象是否能作为垃圾回收,回收呢需要依赖一些回收方面的算法,常见有三种:

我们怎么判断一个对象是否是垃圾呢,沿着GC Root的引用链去找,扫描整个堆对象过程中发现这个对象被引用了,那么它需要保留,没有引用那么他就可以当做垃圾

标记清除:分两个阶段

先标记(看看哪些对象可以是垃圾) 

清除(把对象所占用的空间进行释放)这里的释放是不是把这个内存每个字节进行清零操作呢?不是的,(并不会把所占用的内存进行一个清零操作)它把那个对象占用内存的起始结束地址,记录下来放到空闲的地址列表里,下次再分配对象的时候直接去这个地址列表中去找,看有没有一块足够的空间能够容纳我们的这个对象,从而进行内存分配 

优点:速度快,只要把垃圾对象的起始地址做一下记录就完成了清除操作,不会做其他操作

缺点:可能产生内存碎片,这些空间不连续,虽然加起来内存较大,但是当有大的对象来时这些碎片不连续就存不进去,没有一个有效的内存给他用,可能造成内存的溢出问题

(4)回收算法_标记整理

跟上面的标记清除第一个阶段是一样的把对象进行一个标记,看看哪些对象是垃圾:

整理:避免了标记清除时的碎片问题,当清除的时候,把可用的对象内存往前移动

整理之后呢,这些垃圾内存就没有了,我们发现这些内存变得更紧凑了,那么连续的空间就更多了,就会解决造成的垃圾碎片问题 

 

 优点:不会产生垃圾碎片问题

缺点:由于整理涉及到了对象的移动,必然效率变得较低,比如说一些变量引用了我这个对象,移动后这个变量就需要改变引用的地址啊,效率就低了,速度慢了

(5)回收算法_复制

复制算法是把内存区划分成了两块大小的区域: 

TO这个区域是空闲的 

它首先也要做一个标记,找到不被引用的对象,标记为垃圾

然后呢把把From区域存活的对象复制到TO区域中,复制的过程中呢From区域也会完成碎片的整理

FROM区域全是垃圾了可以进行清除

并且交换FROM和TO 区域的位置:TO 变为FROM,FROM变为TO,TO总是一块空闲的区域

优点:不会产生碎片

缺点:占用双倍的一个内存空间

(6)回收算法总结

 这三种算法在实际的JVM垃圾回收机制中,都会根据不同的情况来采用不会说只用其中一种算法,会结合多种算法实现垃圾回收,下面我们会讲一种分代垃圾回收机制

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

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

相关文章

哨兵模式(sentinel)

为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去&#xff0c…

【算法】算法设计与分析 课程笔记 第一章 概述

第一章 算法概述 算法的性质 算法的四个性质:输入、输出、确定性和有穷性。 算法的时间复杂度 1. 常见的时间复杂度 常数阶 O(1) 对数阶 O(log n) 线性阶 O(n) 线性对数阶 O(nlog n) 平方阶 O(n^2) 立方阶 O(n^3) k 次方阶 O(n^k) 指数阶 O(2^n) 注&…

Prompt 策略:代码库 AI 助手的语义化搜索设计

在过去的一周里,为了更好的构建 AI Agent 框架 Chocolate Factory(以下简称 CF),我们加入了一个新的应用:代码库 AI 助手。 在设计时,为了更好的在框架底层提供这种能力,我们参阅了 Bloop 应用、…

科研小工具|慢性阻塞性肺疾病全球创议

简介 慢性阻塞性肺疾病全球创议(the Global Initiative for Chornic Obstructive Lung Disease,GOLD)是慢性阻塞性肺疾病(COPD)诊断、治疗与预防在全球范围内的标准。颁布GOLD的目的在于,增加医疗卫生工作…

pdd24版滑块

最近pdd改版了,在原来的基础之上加了一个content字段,然后pdd滑块分为两个大类。 一个是22类型的,在之前的文章里面有介绍,感兴趣也可以去看看。 详情的滑块跟普通的版本不同,但是有的算法也沿用了之前22版的东西&a…

【Seata】05 - Seata Saga 模式简单整理、Docker 部署 Nacos 单机(基于 Jpom)相关配置

文章目录 前言参考目录Saga 模式知识点简单整理1、适用场景、优缺点2、Saga 模式的使用3、可能出现的问题以及解决方法 Docker 部署 Nacos 单机(基于 Jpom)步骤 1:拉取镜像步骤 2:构建容器步骤 3:Nacos 设置 Seata 配置…

安装Python第三方库

视频版教程 Python3零基础7天入门实战视频教程 在Python的标准安装中,包含了一组自带的模块,这些模块被成为“标准库”。比如常用的math,random,datetime,os,json等等。 此外,还有很多的第三方模块,或者叫做库也行,叫…

TienChin 渠道管理-配置校验失败信息

新建 ValidationMessages.properties: channel.name.notnull渠道名称不能为空 channel.type.notnull渠道类型不能为空 channel.status.notnull渠道状态不能为空 channel.type.invalid渠道类型无效 channel.status.invalid渠道状态无效

linux上安装redis

这篇文章简单地介绍一下怎么在linux虚拟机上完成redis的安装。 首先,访问Redis官网,点击首页的【Get Started】,然后点击Install Redis on Linux 然后按照页面内容提示,在Ubuntu上安装redis 只需要在终端依次输入以下命令&#xf…

面试官:Vue实例挂载的过程中发生了什么?

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、思考 一、分析 三、结论 一、思考 我们都听过知其然知其所以然这句话 那么不知道大家是否思考过new Vue()这…

权限提升WIN篇(腾讯云,CS,MSF)

溢出漏洞 信息收集 操作系统版本ver,systeminfo漏洞补丁信息systeminfo操作系统位数systeminfo杀软防护tasklist /svc网络netstat -ano,ipconfig当前权限whoami 筛选EXP 根据前面的信息收集中的系统版本,位数和补丁情况筛选出合适的EXP 提权 根据EX…

JVM——4.垃圾回收

这篇文章我没来讲一下JVM中的垃圾回收。这是比较重要,内容也比较多的一篇文章。 目录 1.垃圾回收概述 2.如何判断对象可以回收 2.1引用计数法 2.2可达性分析算法 2.2.1GCRoot的选取 2.3再谈引用 2.3.1强引用 2.3.2软引用 2.3.3弱引用 2.3.4虚引用 2.3.5…

2023关于赴日IT培训你需要了解的

有人还是好奇日本IT行业真的那么缺人吗?我告诉你:缺!和中美完全不同的是,日本的IT行业面临着非常严重的程序员缺口。根据日本经济产业省进行的“关于IT人才供需的调查”,预计到2030年,日本IT行业将会有45万…

进程的就绪、执行、阻塞和挂起

假设我们有一个进程, 它需要的资源有CPU, 资源A(在进程创建时为其分配), 资源B(进程运行时才发现需要资源B), 现在用这个进程来分析一下进程的几种状态. 先看图: 图1: 进程的几种状态 1. 创建 --> 就绪(资源A): 操作系统为进程分配资源A, 进程进入就绪态, 等待CPU. 进程当…

ICS TRIPLEX T8310 自动化控制模块

ICS TRIPLEX T8310 是一种自动化控制模块,通常用于工业控制和自动化系统中,以实现对各种过程和设备的自动控制。以下是可能包括在 ICS TRIPLEX T8310 自动化控制模块中的一些常见产品功能: PLC(可编程逻辑控制器)功能&…

树结构构建,字典树快速生成。

表结构 查出list后&#xff0c;用工具类转换。工具类代码如下&#xff1a; 下面展示一些 内联代码片。 public static List<JSONObject> toTreeList(List tList, String oidkey, Stripspidkey) List<JSONObject> jsonObjectList JSONArray. parseArray (JSON.…

公司电脑监控软件哪个好?(常用公司电脑监控软件有哪些?)

随着科技的发展&#xff0c;公司对员工电脑的监控已经成为了企业管理的重要手段。然而&#xff0c;如何选择合适的公司电脑监控软件&#xff0c;以及如何避免员工发现&#xff0c;成为了企业管理者需要面对的问题。 一、公司电脑监控软件哪个好&#xff1f; 针对公司电脑监控软…

Hive工作原理

Hive 工作原理详解-阿里云开发者社区 Hive的服务端组件 1. Driver组件&#xff1a;该组件包括&#xff1a;Compiler、Optimizer、Executor,它可以将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应…

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存

《数字图像处理-OpenCV/Python》连载&#xff08;7&#xff09;视频文件的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…

记录一下 ThinkPHP 使用JWT进行身份验证

ThinkPHP使用JWT身份验证 1.composer安装jwt&#xff0c;安装命令&#xff1a;composer require firebase/php-jwt 安装成功后会在vendor目录下生成firebase目录文件 第二步&#xff1a;生成token 先引入jwt use Firebase\JWT\JWT; public function getToken($user){//使…