JVM基础(6)——JVM垃圾回收器简介

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

在新生代和老年代进行垃圾回收的时候,都需要使用回收器进行回收,不同的JVM 垃圾回收器会有所不同,不同区域一般也采用不同的垃圾回收器。JVM常见的垃圾回收器有以下几种,我们先来简要看下,后续会针对每一种GC专门详细讲解:

Serial/Serial Old

Serial/Serial Old收集器是最基本也是最古老的垃圾收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程,也就是发生“Stop the World”。一般JVM都不再使用该收集器。

ParNew

ParNew收集器是Serial收集器的多线程版本。新生代并行回收,采用复制算法,老年代串行回收,采用标记整理算法。所以,该收集器一般只用于新生代。

CMS

CMS(Current Mark Sweep)收集器,目标是使回收停顿时间最短,也是多线程机制,采用标记整理算法,该回收器一般用于老年代,生产环境上也经常会使用该垃圾回收器与其它GC搭配使用。

G1

G1最大的特点是没有物理上的新生代和老年代,它们是逻辑的,G1将整个Java堆划分为多个大小相等的独立区域(Region),对新生代和老年代进行统一收集,并且采用了更加优秀的算法和设计机制。

二、Stop the World

2.1 何谓Stop the World

上一节,我们提到过JVM在进行垃圾回收时,会挂起除GC线程以外的所有其它线程,这就会导致系统出现卡顿,这就是JVM所谓的 Stop the World 机制。

假设当前JVM新生代的状态如下,Eden区已被填满,Survivor1区存放着上一次Minor GC后的存活对象,这时候即将触发Minor GC,由垃圾回收线程使用垃圾回收器(新生代一般使用ParNew,采用复制算法),使用特定的垃圾回收算法进行回收,如下图:

回收时,Eden区和Survivor1区的存活对象会被转移到Survivor2区,接着Eden和Survivor1中的垃圾对象都会被回收掉:

JVM在进行垃圾回收时,会让我们的系统暂停,不再创建新的对象,同时让GC线程尽快完成垃圾回收的工作——即标记和转移存活对象:

一旦本轮GC结束,就可以恢复我们的系统程序,继续在Eden区创建新的对象了,如下图:

三、总结

上面就是 Stop the World 的整体流程,Stop the World会导致客户端的请求出现卡顿,短则几百毫秒,长则几秒甚至几分钟。所以,无论是Minor GC还是Full GC,都要避免频率过高,这也是使用JVM过程中最需要关注和优化的地方。

从下一章开始,我们将详细讲解常见的三种垃圾回收器的工作原理,不同回收器 Stop the World 的流程也有所区别,GC的核心目标其实就是降低 Stop the World 的总体时间,这也是JVM不断演化的终极思路。

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

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

相关文章

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

docker微服务案例

文章目录 建立简单的springboot项目(boot3)boot2建立通过dockerfile发布微服务部署到docker容器编写Dockerfile打包成镜像运行镜像微服务 建立简单的springboot项目(boot3) 1.建立module 2. 改pom <?xml version"1.0" encoding"UTF-8"?> <…

数据结构02附录02:哈希表[C++]

图源&#xff1a;文心一言 上机题目练习整理~&#x1f95d;&#x1f95d; 本篇作为线性表的代码补充&#xff0c;每道题提供了优解和暴力解算法&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;在力扣新手村刷题的记录&#xff0c;优解是Bard老师提…

JVM基础(4)——JVM存活判定算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

自己在家怎么给电脑重装系统不用U盘?

自己在家怎么给电脑重装系统不用U盘&#xff1f;用户发现自己在家用的电脑系统出现很严重的问题&#xff0c;但又没有U盘&#xff0c;想知道有什么方法能够给电脑重新安装上一款正常的系统&#xff1f;接下来小编给用户们分享不用U盘完成系统重新安装的方法步骤&#xff0c;一键…

【HTML】对字体的所有操作详解(经典)

目录 一、文字样式设置的基本标签二 、 设置文字的颜色三、设置文字的尺寸四、 设置文字的字体五、 使文字倾斜六、 使文字加粗七、处理网页中的特殊字符十、 如何更方便地忽略浏览器对部分HTML的解析十一、 其他文字修饰方法十二、为了让文字富有变化&#xff0c;或者为了着意…

异步编程利器:CompletableFuture深度解析

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 摘要如何使用源码解析基本结构内部原理执行流程 方法介绍创建对象异步执行任务链式操作异步任务组合异常处理取值与状态超时控制与取消操作依赖完成并发限制记忆…

66、python - 代码仓库介绍

上一节,我们可以用自己手写的算法以及手动搭建的神经网络完成预测了,不知各位同学有没有自己尝试来预测一只猫或者一只狗,看看准确度如何? 本节应一位同学的建议,来介绍下 python 代码仓库的目录结构,以及每一部分是做什么? 我们这个小课的代码实战仓库链接为:cv_lea…

Python 面向对象之单例模式

【一】单例模式概念 单例模式是一种设计模式&#xff0c;其核心思想是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式通常用于管理共享的资源&#xff0c;例如配置信息、数据库连接、线程池等。关键点在于如何判断这个类是否已经实例化 通过模块导入&…

Codeforces Round 911 C. Anji‘s Binary Tree

原题&#xff1a; C. Anji’s Binary Tree time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Keksic keeps getting left on seen by Anji. Through a mutual friend, he’s figured out that Anji really …

人工智能行业的发展前景如何?

人工智能&#xff08;AI&#xff09;已经成为如今科技领域的热门话题之一&#xff0c;从图像识别到自动驾驶&#xff0c;从语音助手到智能机器人&#xff0c;AI技术正在改变我们的生活方式。随着技术的不断发展和应用的扩大&#xff0c;人工智能行业的发展前景无疑是非常广阔的…