GC常见垃圾回收算法,JVM分代模型
如何判断是垃圾?引用计数器和Root可达性算法
如何进行清除?标记清除、复制、标记整理
堆分代模型?Eden,Surevivor,Tenuring
一个对象从创建到消亡的过程?
对象什么时候进入老年代?
一、GC(Garbage Collector)
GC tuning:GC调优
tuning:调整,调优
reference:引用
1、Garbage,什么是垃圾?
没有引用指向的任何对象,都是Garbage
2、判断什么是垃圾的两种算法(也就是怎么找到垃圾):
(1)reference count(引用计数器):
有一个对象引用该变量,在对象头+1,有多个就加多个,没引用了就-1,减到0,说明没有引用了,判定为垃圾;

reference count不能解决的问题是循环引用问题,比如对象A引用对象B,对象B引用对象C,对象C又引用对象A;
相互引用的时候没有任何第三方对象引用这两个对象,不能判断为垃圾,不会被回收,实际上是需要被回收的:

(2)root searching(可达性算法):
在编程过程中哪些对象或者变量会被定义成root?
JVM Stack:虚拟机栈里面的线程栈里面的变量;
Native Stack:c/c++实现的那些native方法里面使用到的变量,会被定义为root对象
静态变量:static修饰的对象
常量池里面的对象:比如Class对象
一般是一个程序启动后马上要用到的对象;

3、找到垃圾之后,如何进行清除?
三种算法:(优缺点是指这种算法的优缺点)
(1)Mark Sweep:标记清除,
特点:
- 从Root对象开始,遍历两次,一次进行标记,一次进行清除;
- 算法简单;执行效率不稳定,垃圾较多,而存活对象少的时候,效率低,内存空间碎片化会更严重;
(2)为解决Mark Sweep算法的缺陷,提出:Semispace Copying:拷贝(半区复制算法)
实现:
- 将内存一份为二,从Root对象开始,将有用的对象移动(复制)到一边,移动完成后清除另一边需要被回收的内存;当垃圾较多,存活对象较少时,只需要将存活对象移动到一块很小的区域,就能进行垃圾清除,效率高,同时也能解决内存空间碎片化的问题;
- 只扫描一次,但移动复制对象,需要调整对象的引用,会产生对象引用指针移动的开销,同时将内存一分为二,也会造成内存减半的后果,空间浪费;
- 如果存活对象比较多的情况下不适合;
- 如果存活对象比较多,内存又减半会导致内存不足,需要老年代进行分配担保(当Eden进行回收后往Surivor区进行复制,Surivor区发现内存不足,对象直接进入老年代)
(3)Mark Compact:标记整理
实现及特点:
- 扫描2次,从Root开始将有用的对象压缩到内存的头部,如果前面有垃圾进行填充
- 需要移动对象,效率偏低;
- 不会产生内存碎片,更方便对象分配,不会产生内存减半;
总结:标记清除和标记整理的算法
- 是否移动对象:移动则回收的时候更复杂,不移动则内存再分配时会更复杂
- 是否停顿(或者说停顿时间更短):移动的时候停顿时间更长,不移动的时候停顿时间短,甚至可以不停顿;
- 吞吐量:从吞吐量的角度考虑,移动对象吞吐量会更高;
- 也就是说,根据业务,如果在意用户体验,不要停顿太长时间的情况下,考虑使用不移动对象的垃圾回收算法,也就是标记-清除
- 如果对吞吐量要求高的场景,使用移动对象的垃圾回收算法,也就是复制或者标记整理的垃圾回收算法会更划算;
二、JVM内存分代模型
1、堆内存的逻辑分区
G1是逻辑分代,但物理内存不分代,除此之外,都是逻辑分代,物理内存也分代

Eden区是new出来的对象真正存放的区域,而S0和S1是经过回收会还存活的对象存在区域
GC算法的选择上,新生代活着的对象比较少适合Copying算法的垃圾回收器,而老年代 ,存活的对象比较多,适合Mark Sweep(MS)和Mark Compact(MC)这两种算法实现的垃圾回收器;
查询年轻代和老年代之间的空间比值:NewRatio=2,意思是年轻代和老年代的比值是1:2:
![]()
![]()
java查询参数小细节:java -XX:PrintFlagsFianl -version
以-开头的标准参数
以-X开头是非标准参数,
以-XX开头,不稳定参数,有些版本支持,有些版本可能不支持,也可能不是这个命令
2、一个对象从创建到消亡的过程:

先尝试栈上分配,如果满了,在Eden区分配,当出现GC时,会往S0区域移动,多次回收是指在S0和S1上来回移动,移动次数可以通过参数配置,经过多次回收还存活,移动到老年代;
MinorGC/YGC: 年轻代垃圾回收,年轻代空间耗尽,无法再分配空间时,触发该GC;
Major/FullGC: 老年代和年轻代都空间耗尽,无法再分配空间时,老年代和年轻代都会触发GC;
3、对象尝试在栈上分配
(1)什么样的内容会在栈上分配?
- 线程私有小对象:对象比较小,而且是线程私有的,没有线程共享
- 无逃逸:出了线程无其他线程知道这个对象的存在
- 支持标量替换:对象只有少量属性,完全可以使用这些属性来替换对象;
(2)当线程栈上分配空间不足了,会进行线程本地分配(Thread Local Allocation Buffer,简称TLAB)
- 每个线程会在Eden区有一块小区域是该线程独享的,用于分配小对象,仅1%;
- 多线程的时候不用竞争Eden区域就可以申请的空间,可以提升对象分配的效率;
4、对象什么时候进入老年代?以下两种情况会进入老年代
(1)通过一个参数设置:XX:MaxTenuringThreshold指定回收次数,也就是当进行GC时,对象在S0和S1之间进行copying,超过该参数设置的值,就会触发对象进入老年代;
该参数,在
Paralle Scavenge中默认是15
CMS:6
G1:15
(2)动态年龄,是指将S0里面的存活对象全部拷贝到S1的时候,如果发现全部对象的大小超过了S1的空间的50%,则会触发动态年龄淘汰机制,就是把年龄最大的那些对象放入老年代,而不管他的copying次数是否超过设置的阈值;

相关文章:
GC常见垃圾回收算法,JVM分代模型
如何判断是垃圾?引用计数器和Root可达性算法 如何进行清除?标记清除、复制、标记整理 堆分代模型?Eden,Surevivor,Tenuring 一个对象从创建到消亡的过程? 对象什么时候进入老年代? 一、GC&a…...
面试题整理(三)
芯冰乐知识星球入口:...
可视化建模以及UML期末复习----做题篇
一、单项选择题。(20小题,每小题2分,共40分) 1、UML图不包括( ) A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案:C、流程图 UML中不包括传统意义上的流程图,流程图通常是指B…...
PostGIS分区表学习相关
在Postgresql中对空间数据进行表分区的实践_postgresql空间数据-CSDN博客文章浏览阅读1.4k次,点赞26次,收藏21次。Postgresql的分区功能允许将一个大表按照特定的规则拆分成多个小的分区表。这样做的好处在于,在查询数据时,可以只…...
JavaEE 【知识改变命运】03 多线程(3)
文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因:1.线程是抢占式的2. 多线程修改同一个变量(程序的要求)3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…...
Flash操作 原子写 非原子写
原子和非原子操作 读、修改、写操作 对一个变量 A 1或上0x01,C语言写法: A 1| 0x01; 通过编译转成汇编后: LOAD R1,[#A 1] ; Read a value from A 1 into R1 MOVE R2,#0x01 ; Move the absolute constant 1 into R2 OR R1,R2 ; Bitwise O…...
厦门凯酷全科技有限公司怎么样?
随着短视频和直播带货的兴起,抖音电商平台迅速崛起,成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中,如何抓住机遇、实现销售增长,成为了每个企业面临的挑战。厦门凯酷全科技有限公司(以下简称“凯酷全”&…...
ubuntu 18.04设置命令行历史记录并同时显示执行命令的时间
以下相关详细信息请参考ubuntu官网。 在Ubuntu 18.04中,查看特定用户(例如用户broko)的命令行历史记录,并同时显示执行命令的时间,可以通过修改用户的shell配置文件来实现: • 设置HISTTIMEFORMAT环境变量…...
推荐系统里面的多任务学习概述
1. 概述 多任务学习(multi-task learning),本质上是希望使用一个模型完成多个任务的建模,在推荐系统中,多任务学习一般即指多目标学习(multi-label learning),不同目标输入相同的fe…...
解决uview ui赋值后表单无法通过验证
微信小程序中 主要还是文档有这样一段话://如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。 添加即可通过 onReady() {//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过…...
【GL010】C/C++总结(二)
C部分 1. C中类成员的访问权限 无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。在类的外部 (定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 p…...
【合作原创】使用Termux搭建可以使用的生产力环境(五)
前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(四)-CSDN博客我们讲到了如何让proot-distro中的Debian声音驱动正常,将我们的系统备份后,通过VNC客户端连接到VNC服务器,这一篇我们来讲一下xfce桌面的美…...
初始数据结构
程序数据结构算法 数据结构研究计算机数据(元素)间关系 包括数据的逻辑结构和存储结构及其(数据间)操作 一、基本概念 1.1数据 数据即信息的载体,能被输入到计算机中并且能被它识别、存储和处理的符号总称 1.2数据…...
给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题
前言 最近在用自己的卡盒小程序的时候,发现卡片越来越多,有时候要找到某一张来看看笔记要找半天,于是自己做了一个搜索功能,先看效果: 怎么样,是不是还挺不错的,那么这篇文章就讲讲这样一个搜索…...
MATLAB中的合并分类数组
目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A,其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...
ShardingSphere-JDBC
1. 什么是分库分表? 分库分表是一种数据库扩展技术,通过将数据拆分到多个数据库(分库)或多个表(分表)中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力&…...
企业如何选择远程控制软件来远程IT运维?
在当今企业的日常运作中,IT运维无疑是核心环节之一,它对于保持企业信息系统的稳定运行和数据安全至关重要。随着科技的快速进步,远程控制软件在IT运维中的应用变得越来越重要。今天,我们就来探讨一下远程控制软件如何助力企业IT运…...
Meta Llama 3.3 70B:性能卓越且成本效益的新选择
Meta Llama 3.3 70B:性能卓越且成本效益的新选择 引言 在人工智能领域,大型语言模型一直是研究和应用的热点。Meta公司最近发布了其最新的Llama系列模型——Llama 3.3 70B,这是一个具有70亿参数的生成式AI模型,它在性能上与4050…...
【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…...
go语言zero框架对接阿里云消息队列MQ的rabbit的配置与调用
在 Go 语言中对接阿里云消息队列(MQ)的 RabbitMQ 配置与调用,首先需要安装和配置相关的 Go 库,并了解如何通过 RabbitMQ 与阿里云消息队列进行交互。 ### 步骤一:安装 RabbitMQ Go 客户端库 阿里云的消息队列&#x…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
