当前位置: 首页 > news >正文

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…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...