垃圾回收机制

news2024/11/18 21:34:51

1.什么场景下该使用什么垃圾回收策略?
(1).对内存要求苛刻的场景
想办法提高对象的回收效率,尽可能的多回收一些对象,腾出更多内存

(2).在CPU使用率较高的情况下
降低高并发时垃圾回收频率,让CPU更多地去执行业务而不是垃圾回收

2.垃圾回收会发生在哪些区域?
线程共享区域的堆和方法区

3.如何判断对象可以被回收?
(1).引用计数法
每个对象都有一个引用计数器,新增一个引用,引用计数器加1,释放一个引用时,引用计数器减1,当引用计数器的值为0时可以回收。
引用计数法,可能会出现循环引用,如A引用了B,B又引用了A,导致A和B的引用计数器永远都是1,即时A和B不再使用了,也无法被回收。

(2).可达性分析法
从GC ROOTS对象开始向下搜索,搜索所走过的路径称为引用链。如果一个对象到GC ROOTS对象没有任何引用链相连时,则证明此对象是不可用的,那么JVM就判断该对象是可回收的。
在这里插入图片描述

可达性算法中不可达的对象并不是立即死亡的,而是需要经过如下判断。首先判断对象是否覆盖了finalize()方法,如果没有则直接进行回收。如果覆盖了finalize()方法,则需要继续判断是否执行过finalize()方法,如果没有执行,则将该对象放入F-Queue中等待被执行,如果执行过finalize()方法,则需要再判断一次该对象是否可达,如果不可达则回收,如果可达则复活。
在这里插入图片描述

(3).GC Roots对象有哪些?
虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中静态变量引用的对象
方法区中常量引用的对象

(4).引用
强引用:只要强引用在,就不会被回收。Object object = new Object()。
软引用:描述有用但是非必需的对象,只有在内存不足的时候才会被回收。
弱引用:描述非必需的对象,不管内存是否足够,都会被回收。
虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被回收。

4.垃圾回收算法
(1).标记清除(Mark-Sweep)
标记清除算法分为两个阶段,一是标记阶段,把垃圾标记出来,二是清除阶段,把内容回收。这种算法简单,但是有个严重的问题,就是会产生大量的内存碎片。
在这里插入图片描述

(2).标记整理算法(Mark-Compact)
标记整理算法在标记阶段和标记清除算法一样,但是在完成标记之后,不是直接清理,而是将存活的对象往一端移动,然后将端边界以外的内存直接清除。
在这里插入图片描述

(3).复制算法(Copy)
复制算法将内存分为大小相等的两半,每次只使用其中的一半。垃圾回收时,将正在使用的这一半区域里的存活对象复制到未使用的一半区域去,然后将含有垃圾的那一半内存直接清除。这种算法不存在内存碎片,但是最大的问题是浪费空间,内存利用率低。
在这里插入图片描述
(4).三种算法对比

复制优点缺点
标记清除简单存在内存碎片
标记整理无内存碎片整理存在开销
复制无内存碎片内存利用率低

(5).增量算法
内存是一块比较大的区域,如果对整片内存进行回收,工作量比较大,可能会造成卡顿。因此,增量算法的思路是,每次只回收一小块内存里的垃圾。

5.分代收集算法
(1).概念
根据对象的存活周期,将内存分为多个区域,不同的区域使用不同的回收算法回收对象。
在这里插入图片描述

(2).分代回收分类
新生代回收(Young GC):复制算法
老年代回收(Major GC):标记清除和标记整理
整堆回收(Full GC)

(3).一个对象在堆内存的经历过程
对象首先会分配在堆内存中新生代的Eden区,然后经过一次Young GC后,如果还存活,就会进入Survivor区。在后续的每次Young GC后,如果对象一直存活,那么该对象就会在
Survivor的两个区域来回复制,每复制一次,年龄就加1,当年龄为15时,就会转入老年代。

对象进入老年代的两种特殊情况,一是如果新生代空间不够,也会将对象直接分配到老年代,因为新生代采用复制算法,大对象需要在Survivor区来回复制,开销较大。二是,对象年龄不一定要达到15才进入老年代,如果Survivor空间中所有相同年龄对象的大小总和大于Survivor空间的一半,那么年龄大于等于该年龄时的对象就可以直接进入老年代。

(4).触发机制
新生代回收(Young GC):新生代空间不足
整个堆回收(Full GC)):老年代或元空间内存不足(要晋升到老年代对象的空间大于老年代剩余空间),以及显示调用System.gc()。

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

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

相关文章

一文搞懂 Redis 架构演化之路

现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如何稳定、高性能地提供服务的? 我使用 Redis 的场景很简单,只使用单机版 Redis 会有什么问…

vite + react +typescript 环境搭建,小白入门级教程

目录前言1. 使用 vite 创建 react 项目1. npm / yarn 命令初始化2. 输入项目名称3. 选择框架4. 选择 Js / Ts5. 项目创建完成6. 启动项目2. 规范项目目录3. 使用 react-router-dom 路由1. 使用 npm / yarn 命令下载2. 更改 react-router-dom 版本1. 通过 npm 命令降低版本2. 手…

rabbitmq基础5——集群节点类型、集群节点基础运维,集群管理命令,API接口工具

文章目录一、集群节点类型1.1 内存节点1.2 磁盘节点二、集群基础运维2.1 剔除单个节点2.1.1 集群正常踢出正常节点2.1.2 服务器异常宕机踢出节点2.1.3 集群正常重置并踢出节点2.2 集群节点版本升级2.3 集群某单节点故障恢复2.3.1 机器硬件故障2.3.2 机器掉电2.3.3 网络故障2.3.…

Android ShapeableImageView使用

ShapeableImageView使用使用 导包 implementation com.google.android.material:material:1.4.0属性 属性描述shapeAppearance样式shapeAppearanceOverlay样式,叠加层strokeWidth描边宽度strokeColor描边颜色 样式 名称属性值描述cornerFamilyrounded圆角cut裁剪…

学习记录-mybatis+vue+elementUi实现品牌查询

和以往不同的是,这一次使用了vue和axios来接收后端传过来的参数,并且新建了impl文件来继承service层的接口。该过程实现一共分为4步骤 步骤一 ①mapper mapper 写mapper接口 其实就是写SQL语句了,第一步就是写SQL。这里使用的是注解开发&…

程序员危机如何化解?

很多人认为程序员一定要干到管理层,才会有继续走下去的希望,而踏实做技术的程序员,只会面临淘汰。事实真是如此吗? △ 截图来源脉脉,如侵删 先不说结论,我们一起先看看网友们的看法: △ 截…

报表控件Stimulsoft v2023.1全新发布 | 附免费下载试用

Stimulsoft Ultimate 宣布发布新版本2023.1!在最新版本中添加了对Razor Pages的支持、新的数据监视器可视化工具、为PHP和Blazor平台更新了组件,欢迎下载试用! Stimulsoft Ultimate官方正版下载 Razor Pages 在 2023.1.1 版中,我们添加了对…

跨域问题以及解决跨域问题的vue-cli解决方案

跨域问题 写项目前要问后端,接口支持跨域吗? 支持就不会出现问题,不支持就需要解决跨域问题 1.如何判断一个浏览器的请求是否跨域? 在A地址(发起请求的页面地址)向B地址(要请求的目标页面地址)发起请求时&#xff…

【JavaEE】多线程(三)线程的状态

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaEE】 ✈️✈️本篇内容:线程的状态,线程安全问题! 🚀🚀代码存放仓库gitee:JavaEE初阶代码存放&a…

抗癌药物之多肽药物偶联物技术(PDC)介绍

长期以来,心血管疾病是全球中年人死亡的主要原因。这种情况最近在高收入国家发生了变化,现在癌症导致的死亡人数是心血管疾病的两倍。2018 年,癌症导致全球 960 万人死亡,1810 万新病例被诊断出来。女性最常发生的癌症是乳腺癌&am…

12Python继承与多态

继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中继承 实现代码的重用,相同的代码不需要重复的编写多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 1继承的概念、语法和特点 继承的概…

奖项快报 | ALVA Systems 上榜 《2022 高成长企业 TOP100》!

近日,《2022 高成长企业 TOP 100》榜单发布,凭借卓越的创新能力与在工业 AR 领域的赋能价值,ALVA Systems 在2022年度高成长企业TOP100大赛活动中脱颖而出,成功入选榜单。 *ALVA Systems 入选榜单 创新驱动,赋能数字经…

【ARM -- stm32 汇编代码点亮LED灯】

ARM -- stm32 汇编代码点亮LED灯实现过程查询开发手册分析RCC章节分析GPIO章节编写代码实现过程 查询开发手册 分析RCC章节 一、确定RCC基地址 二、分析RCC_MP_AHB4ENSETR寄存器 1、RCC_MP_AHB4ENSETR寄存器的功能是使能GPIO组相关控制器; 2、RCC_MP_AHB4ENSET…

07第四章:01_常用注解

常用注解 1、Table 作用:建立实体类和数据库表之间的对应关系。 默认规则:实体类类名首字母小写作为表名,如 Employee -> employee 表 用法:在 Table 注解的 name 属性中指定目标数据库的表名; 案例&#xff1…

WPF依赖属性、附加属性、属性继承、类型转换详解

依赖属性 依赖属性回调方法与参数 具有依赖属性的类必须继承自DependencyObject,定义依赖属性要有2个步骤 //1属性包装器,目的是为了向正常属性一样使用依赖属性 public int Name {get { return (int)GetValue(NameProperty); }set { SetValue(NamePr…

国家“数据安全三认证”图解来了

二十大指引新时代新征程。蓝图已经绘就,号角已经吹响,新征程是充满光荣和梦想的远征。二十大报告深刻阐明了实现中华民族伟大复兴的一系列重大问题,系统擘画了以中国式现代化推进民族复兴的宏伟蓝图,是引领中华民族伟大复兴的政治…

论文导读 | GPU上的动态图数据管理技术浅析

一、背景介绍 随着相关技术的发展,图计算与分析系统在大量场景中得到应用。同时,为了解决图规模巨大等因素导致的性能下降问题,研究人员利用GPU这一新型计算硬件,设计了大量高效的图计算与分析解决方案。GPU提供的高并发计算能力…

我司何晓磊受邀参加东盟与中日韩中小企业人工智能产业论坛并担任评委

我司何晓磊受邀参加东盟与中日韩中小企业人工智能产业论坛并担任评委 一、活动背景 为推动东盟与中日韩(103)中小企业服务联盟务实合作,帮助中小企业提高生产力和技术创新能力,进一步提高国际化发展水平,促进东亚区域…

C++——哈希练习题

文章目录一、编程题1.在长度 2N 的数组中找出重复 N 次的元素2. 两个数组的交集二、面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】(一)位图应用1. 给定100亿个整…

C++ :STL:初识

1:STL初识 1.1 STL的诞生 STL 诞生来源 长久依赖,软件界一直希望建立一种可重复利用的东西C 的面向对象和泛型思想,目的就是复用性的提升大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复的工作为了…