GC常见垃圾回收算法,JVM分代模型

news2025/3/1 0:01:20

如何判断是垃圾?引用计数器和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次数是否超过设置的阈值;

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

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

相关文章

win11 恢复任务栏copilot图标, 亲测有效

1、修改C:\Windows\System32\IntegratedServicesRegionPolicySet.json,解除中国不能使用copilot的限制。 使用Notepad搜索copilot全文搜索,将下面两处的“CN,”删除,删除后如下: {"$comment": "Show Copilot on t…

nginx生成自签名证书

nginx生成自签名证书 openssl genrsa -out server.key 2048 openssl req -new -subj "/CCN/STJiangSu/LSuZhou/Oldap/OUldap/CN10.20.24.101" -key server.key -out server.csr openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt …

【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面

sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…

【重生之我在B站学MySQL】

MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…

Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

eclipse启动的时候,之前一切很正常,但突然报Reason: Failed to determine a suitable driver class的解决

1、之前项目都是启动正常的&#xff0c;然后运行以后发现启动不了了&#xff0c;还会报错&#xff1a; 2、这个Reason: Failed to determine a suitable driver class&#xff0c;说是没有合适的驱动class spring:datasource:url: jdbc:sqlserver://192.168.1.101:1433;databa…

PostGIS分区表学习相关

在Postgresql中对空间数据进行表分区的实践_postgresql空间数据-CSDN博客文章浏览阅读1.4k次&#xff0c;点赞26次&#xff0c;收藏21次。Postgresql的分区功能允许将一个大表按照特定的规则拆分成多个小的分区表。这样做的好处在于&#xff0c;在查询数据时&#xff0c;可以只…

【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时

sgUploadList源码 <template><div :class"$options.name"><ul class"files"><li v-for"(a, i) in files" :key"i"><sgFileLink :data"a" remove"remove(a, i)" clearable /></…

C#核心(16)万物之父和装箱拆箱

前言 西方说人类的万物之父是亚当&#xff0c;中国说人类的万物之母是女娲&#xff0c;那么c#中有没有一个万物之父呢&#xff1f; 有&#xff0c;我们今天就来浅浅聊一下。 在C#和许多其他面向对象编程语言中&#xff0c;“万物之父”指的是Object类。这个类的历史和重要性…

网页核心页面设计(第7章)

一、生态家居网页 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevi…

IoTDB 删除数据后文件大小不减反增

现象 时序数据库 IoTDB 删除大量数据后&#xff0c;为什么 data 空间不减反增&#xff1f; 原因 IoTDB 的存储引擎采用 LSM&#xff08;Log-Structured Merge&#xff09;架构。在执行删除操作时&#xff0c;系统会生成 .mod 文件来标记删除的数据。这些删除标记会在后续的合…

WPF Prism 01-BootstrapperShell

Prism介绍 Prism 是一个用于在 WPF、.NET MAUI、Uno 平台和 Xamarin Forms 中构建松耦合、可维护和可测试的 XAML 应用程序的框架。每个平台都有单独的发布版本&#xff0c;并且这些版本将在独立的开发时间线上进行开发。Prism 提供了一组设计模式的实现&#xff0c;这些模式有…

html中,实现通过拖拽调整图像尺寸

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>html中拖拽修改图像尺寸</title> <styl…

Composer在安装的过程中经常找不到刚更新的包

明明有v2.1.0版本&#xff0c;安装就是找不到这个版本的包。 1. Composer 官方网址&#xff1a;https://getcomposer.org 中文网站&#xff1a;https://www.phpcomposer.com 官方文档&#xff1a;https://docs.phpcomposer.com 2. Packagist Packagist 是 Composer的组件仓库…

项目实例_FashionMNIST_CNN

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

使用数据库同步中间件DBSyncer实现不同数据库的数据同步

点击上方蓝字关注我 有去O(ORACLE数据库)、信创、国产化数据库等项目实践的同学应该都遇到过不同数据库之前进行数据迁移的问题&#xff0c;虽然有各种工具可以实现&#xff0c;但是有些工具的部署、使用比较复杂&#xff0c;也有些工具迁移数据效率很低。本文将介绍一款开源且…

SQL汇总数据:聚集函数

我们经常需要汇总数据而无需实际检索出这些数据&#xff0c;为此SQL提供了专门的函数。使用这些函数&#xff0c;SQL查询能够高效地检索数据&#xff0c;以便进行分析和报表生成。这类检索的例子包括&#xff1a; 确定表中行数&#xff08;或者满足某个条件或包含某个特定值的…

HTML颜色-HTML脚本

HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本&#xff0c;比如javascript 可包含脚本语句&#xff0c;也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作&#xff0c;表单验证以及动态的内容更新 HTML<n…

ASP.NET Core8.0学习笔记(二十五)——EF Core Include导航数据加载之预加载与过滤

一、导航属性数据加载 1.在EF Core中可以使用导航属性来加载相关实体。 2.加载实体的三种方式&#xff1a; (1)预先加载&#xff1a;直接在查询主体时就把对应的依赖实体查出来&#xff08;作为初始查询的一部分&#xff09; (2)显式加载&#xff1a;使用代码指示稍后显式的从…

【工具变量】上市公司企业过度负债数据(2000-2022年)

一、计算方式&#xff1a;参考C刊《投资研究》汪昌云&#xff08;2022&#xff09;老师的研究&#xff0c;将实际负债率与 Tobit 回归得到的目标负债率之差认定为过度负债率&#xff0c;该种方式认为目标负债率的驱动因素包括公司特征与行业因素&#xff0c;较为全面&#xff0…