一文了解GC垃圾回收

一文了解GC垃圾回收
在这里插入图片描述

1 判断一个对象为垃圾对象的方法

  1. 引用计数法(弃用)

  2. 可达性分析算法

    是否有指向GC root 的引用链,如果有,不是垃圾对象 ---->GC roo:即rt.jar包中内容

2 内存泄漏与内存溢出区别

泄漏:原本需要被回收的对象,没有被回收

溢出:内存空间不够用,导致溢出现象

例:

ThreadLocal

在购物车模块中,我们的实现思路是,无论登录与否,都可以添加购物车,但是在并发的情况下,就有可能会导致大量的userInfo(userkey或者UserId),如果这些

对象不能够及时被垃圾回收器清理掉,就有可能导致服务器内存不够用,从而导致服务器宕机,项目中为了解决这个问题,使用ThreadLocal的set方法保存用户对

象,通过观察源码发现,被ThreadLocal保存的对象具有弱引用的特性(发现即回收),这样就可以规避可能出现的OOM风险

3 对象引用方式

  1. 强引用(StrongReference)

    永不回收

    当一个对象被一个或多个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收。系统内存空间足够时,它不会被系统回收,程序也可以使用该

    对象,当系统内存空间不足时,系统可能会回收它。

  2. 软引用(SoftReference)

    内存不够就回收

    系统内存空间足够时,它不会被系统回收,程序也可以使用该对象,当系统内存空间不足时,系统可能会回收它。软引用通常用于对内存敏感的程序中。

  3. 弱引用(WeakReference)

    检测到就回收

    和软引用很像,但是引用级别更低,对于弱引用而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说

    当一个对象只有弱引用时,它就会立即回收——正如那些失去引用的对象一样,必须系统垃圾回收机制运行时才会被回收。

  4. 虚引用(PhantomReference)

    虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和**引用队列联合(ReferenceQueue)**使用。单独使用虚引用没有太大意义。

    虚引用主要作用就是跟踪对象垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否有给引用,从而了解虚引用的对象是否即将回收。

    4 垃圾回收算法

1 复制算法

需要在内存中开辟两块同样大小的空间,用于复制没有被回收的对象,体现在新生区的设计思路,包含幸存0区 幸存1区

优点:

速度快

缺点:

浪费一定的内存空间

2 标记清除

扫描了整个空间两次,先进行垃圾对象的标记,在进行垃圾对象的清理

优点 :

实现简单

缺点:

  1. 回收效率低—>扫描了整个空间两次:第一次:标记存活对象,第二次:清除没有标记的对象
  2. 产生内存碎片对于需要使用连续内存空间的对象(比如数组对象)的时候,会造成空间浪费,堆利用率低

3 标记压缩

先进行垃圾对象的标记,对内存进行整理,最后对垃圾对象进行清理

优点:

内存整理,堆的浪费少,利用效率高

缺点:

至少需要扫描了整个空间三次,速度慢

4 分代收集

频繁回收新生区,较少回收养老区,基本不动元空间

新生区:用复制算法

养老区:用标记清除算法 或者 标记压缩算法

5 垃圾回收器

1 串行回收器

serial GC 新生区的垃圾对象回收 复制算法 单线程的收集器,收集垃圾时,必须stop the world

serial Old GC 养老区的垃圾对象回收 标记整理

2 并行回收器

(jdk8默认使用的垃圾回收器组合) 复制算法

parallel GC 新生区的垃圾对象回收

parallel Old GC 养老区的垃圾对象回收 标记整理

3 并发回收器

CMS(Concurrent Mark Sweep) 一款非常流行的并发回收器,目前java市面上依然有大量的公司使用该回收器回收养老区的对象,采用的垃圾回收算法::标记清除算法

parNew parallel new 并行回收新生区的一个回收器,采用的垃圾回收算法:复制算法

G1 jdk9之后默认的垃圾回收器,采用的垃圾回收算法: 标记整理算法

  1. Region

    • 红色:伊甸园区
    • S+红色:幸存区
    • 蓝色:养老区
    • H+蓝色:大对象
  2. Rset

    用于记录一个Region中的对象是否被其他Region引用的情况

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

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

相关文章

C++系列之list的模拟实现

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 list的节点类 template struct list_Node { public: list_Node* _prev; list_…

关于本地项目上传到gitee的详细流程

如何上传本地项目到Gitee的流程: 1.Gitee创建项目 2. 进入所在文件夹,右键点击Git Bash Here 3.配置用户名和邮箱 在gitee的官网找到命令,注意这里的用户名和邮箱一定要和你本地的Git相匹配,否则会出现问题。 解决方法如下&…

linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法

linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法 linux上java -jar方式运行定期自动清理nohup.out文件的内容**验证**定时器crontab使用时注意事项 linux上java -jar方式运行 参考:https://blog.csdn.net/qq_42169450/arti…

2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码

2023妈妈杯数学建模B题完整版思路、模型代码已出!!! 云顶数模最新完整版解题思路、模型代码,供大家参考~~ B题目 解题思路 详细模型解析:

开启CETOS 裸奔了一年的服务器开启firewall防火墙

记录一下关于firewall,博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙,iptables和firewall均是关闭状态,通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…

ubuntu安装nps客户端

Ubuntu安装nps客户端 1.什么是nps内网穿透?2.设备情况3.下载客户端3.链接服务端3.1、无配置文件模式3.2、注册到系统服务(启动启动、监控进程) 1.什么是nps内网穿透? nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发…

云端代码编辑器Atheos

什么是 Atheos ? Atheos是一个基于 Web 的 IDE 框架,占用空间小且要求最低,构建于 Codiad 之上,不过 Atheos 已从原始 Codiad 项目完全重写,以利用更现代的工具、更简洁的代码和更广泛的功能。 注意事项 群晖内核版本太…

浅谈中国汽车充电桩行业市场状况及充电桩选型的介绍

安科瑞虞佳豪 车桩比降低是完善新能源汽车行业配套的一大重要趋势,目前各国政府都在努力推进政策,通过税收减免、建设补贴等措施提升充电桩建设速度,以满足新能源汽车需求。 近年来,在需求和技术的驱动下,充电桩的平…

Mac怎么删除文件和软件?苹果电脑删除第三方软件方法

Mac删除程序这个话题为什么一直重复说或者太多人讨论呢?因为如果操作不当,可能会导致某些不好的影响。因为Mac电脑如果有太多无用的应用程序,很有可能会拖垮Mac系统的运行速度。或者如果因为删除不干净,导致残留文件积累在Mac电脑…

Jmeter的接口自动化测试

在去年实施了一年的三端(PC、无线M站、无线APP【Android、IOS】)后,今年7月份开始,我们开始进行接口自动化的实施,目前已完成了整个框架的搭建以及接口的持续测试集成。今天做个简单的分享。 在开始自动化投入前&#…

第14期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

vscode 保存 “index.tsx“失败: 权限不足。选择 “以超级用户身份重试“ 以超级用户身份重试。

vscode 保存 "index.tsx"失败: 权限不足。选择 “以超级用户身份重试” 以超级用户身份重试。 操作:mac在文件夹中创建文件,sudo 创建umiJs项目 解决:修改文件夹权限 右键文件夹

STM32F103单片机内部RTC实时时钟驱动程序

一、STM32f103系列RTC功能 RTC实时时钟功能是嵌入式软件开发中比较常用的功能,一般MCU的RTC功能都带有年月日时间寄存器,比如STM32F4xx系列,RTC描述如下: 可见F4系列的RTC功能比较强大,设置好初始时间后,读…

NodeJS爬取墨刀上的设计图片

背景 设计人员分享了一个墨刀的原型图,但是给的是只读权限,无法下载其中的素材;开发时想下载里面的一张动图,通过浏览器的F12工具在页面结构找到了图片地址。 但是浏览器直接访问后发现没权限: Nginx 的 403 页面。。…

批量编辑 Outlook 联系人

现状 Outlook 自带的联系人编辑功能无法快速、批量编辑联系人字段使用 Excel 等外部编辑器,可批量编辑联系人 导出联系人到文件 在【联系人】界面,点击【文件】在【文件】界面,点击【打开和导出】–>【导入/导出】在弹出的向导窗口中点…

语法复习之C语言与指针

内存是如何存储数据的? 在C语言中定义一个变量后,系统就会为其分配内存空间。这个内存空间包括了地址和长度。将变量赋值后,该值就被写入到了指定的内存空间中。内存空间的大小一般以字节作为基本单位。   普通变量存放的是数据&#xff0c…

学习paddle-detection(paddlex的使用)

首先下载paddlex(网页)的本地软件,下载链接如下: paddlex 下载完成后进行安装 打开后选择开发者模式,开发者模式主要是和VScode进行集成 本章节主要介绍在开发者模式下可以查看和编辑的文件及其作用,关于…

【优选算法系列】第一节.双指针(283. 移动零和1089. 复写零)

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:优选算法系列 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff01…

LabVIEW开发基于图像处理的车牌检测系统

LabVIEW开发基于图像处理的车牌检测系统 自动车牌识别的一般步骤是图像采集、去除噪声的预处理、车牌定位、字符分割和字符识别。结果主要取决于所采集图像的质量。在不同照明条件下获得的图像具有不同的结果。在要使用的预处理技术中,必须将彩色图像转换为灰度&am…

LaTeX:在标题section中添加脚注footnote

命令讲解 先导包: \usepackage{footmisc} 设原标题为: \section{标题内容} 更改为: \section[标题内容]{标题内容\protect\footnote{脚注内容}} 语法讲解: \section[]{} []内为短标题,作为目录和页眉中的标题。…