JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

详细画的jvm模型图

https://www.processon.com/diagraming/64c8aa11c07d99075d934311

官方网址

https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
在这里插入图片描述

相关概念

  • 年轻代是所有新对象被分配和老化的地方。当年轻代填满时,这会导致minor garbage collection,minor gc会回收掉很多的游离对象。游离的年轻代很快就被收集起来。一些幸存的最终转移到老年代。

  • Stop the World Event(STW),所有minor gc都是STW。这意味着所有应用程序线程都将停止,直到操作完成。

  • 老年代用于存储长期存活的对象。通常,为年轻代对象设置阈值,当达到该年龄时,对象将移动到老年代。最终需要回收老年代。此事件称为major garbage collection。

  • major gc也会触发STW。通常,major gc会更慢,因为它涉及所有活动对象。因此,对于响应式应用程序,应尽量减少major gc。

分代垃圾回收过程:

1.首先,任何新对象都被分配到eden区。两个幸存区一开始都是空的。

在这里插入图片描述

2.当eden区填满时,将触发minor gc

在这里插入图片描述

3.引用的对象将移动到S0。清除eden,将删除未引用的对象。

在这里插入图片描述

4.在下一个minorGC中,eden也会发生同样的事情。未引用的对象将被删除,引用的对象将移动到幸存者区。但是,在这种情况下,它们被移动到第二个幸存者区 (S1)。此外,来自第一个幸存者区 (S0) 上最后一次minor GC 的对象会增加其年龄并移动到 S1。一旦所有幸存的物体都被移动到S1,S0和Eden都会被清除。请注意,我们现在在幸存者区s1中有不同年龄age的对象

在这里插入图片描述

5.在下一次minor GC 中,重复相同的过程。然而,这一次幸存者空间切换了。引用的对象将移动到 S0。幸存的对象会老化age+1。eden和S1被清除。

在这里插入图片描述

6.这里为了演示,当年龄对象达到一定的年龄阈值(在本例中为 8)时,它们将从新生代晋升为老年代

在这里插入图片描述

7.随着minor GC 的继续出现,对象将继续提升到老年代

在这里插入图片描述

8.这几乎涵盖了年轻代的整个过程。最终,将对老年代进行major GC,以清理和压缩该空间

在这里插入图片描述

常用的设置项

设置项描述
-XmsSets the initial heap size for when the JVM starts. 设置 JVM 启动时的初始堆大小
-XmxSets the maximum heap size.设置堆最大值
-XmnSets the size of the Young Generation.设置年轻代最大值
-XX:PermSizeSets the starting size of the Permanent Generation.设置永久代的起始值
-XX:MaxPermSizeSets the maximum size of the Permanent Generation设置永久代的最大值

案例:下面是一个简单的开始Java2Demo的例子:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

java垃圾回收算法

1.标记-清除法:通过gc root 标记所有被程序引用的对象,然后清理没有被标记的对象。总共分为两个阶段:标记和清除缺点:1.效率较低,标记和清除两个动作都需要遍历所有对象,并且在GC时,都需要暂停应用程序,对于交互性比较要求比较高的应用而言这种体验非常差2.会产生内存碎片,通过标记清除法清理出来的内存碎片化较为严重,因为被清理的对象存在于内存的各个角落,所以清理出来的内存不是连贯的2.标记-整理法:是在标记清除法的基础上进行了优化,和上面的一种算法标记阶段是一样的,不同的是在清除阶段,不是简单的清除未标记的对象,而是将所有的已经标记的存活对象移向一端,然后清除该端以为的所有内存。缺点:解决了标记清除法碎片化问题,同时多了整理的这一步,对象移动内存位置的步骤,其效率有一定的影响3.复制算法:这是一种将内存空间分为两个部分的垃圾回收算法,通常称为“From”空间和“To”空间。在分配内存时,对象会被分配到From空间。当From空间占满一定比例时,触发垃圾回收过程。垃圾回收器会遍历From空间,将存活的对象复制到To空间,并按照顺序排列。然后,回收整个From空间,将其标记为空闲的内存,然后将From空间和To空间交换角色缺点:如果内存中的垃圾对象较多,需要复制的对象少,这种情况下使用这个算法比较合适效率较高,反之,不合适。

垃圾回收器的分类

分类方式:按线程数分、按照工作模式分、按碎片处理方式分、按工作的内存区间分

按线程数分

  • 可以分为串行垃圾回收器(Serial Collector)和并行垃圾回收器(Parallel Collector)。
    • 串行回收指的是在同一时间段内只允许有一个 CPU 用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。
    • 和串行回收相反,并行收集可以运用多个 CPU 同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了 STW 机制。

按照工作模式分

  • 可以分为并发式垃圾回收器和独占式垃圾回收器。
    • 并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。
    • 独占式垃圾回收器一旦运行,就停止应用程序中的所有用于线程,直到垃圾回收过程完全结束。

按碎片处理方式分

  • 可以分为压缩式垃圾回收器和非压缩式垃圾回收器。
    • 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。(再分配对象空间使用指针碰撞)
    • 非压缩式的垃圾回收器不进行这步操作。(再分配对象空间使用空闲列表)

按工作的内存区间分

  • 又可分为年轻代垃圾回收器和老年代垃圾回收器

设置案例

串行回收器

要启用串行回收器(Serial Collector)使用,请执行以下操作:
-XX:+UseSerialGC
下面是用于启动Java2Demo的示例命令行:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

并行回收器

也称为吞吐量回收器。因为它可以使用多个 CPU 来加快应用程序吞吐量。当需要完成大量工作并且可以接受长时间暂停时,应使用此回收器。例如,批处理,如打印报表或帐单,或执行大量数据库查询。
-XX:+UseParallelGC
使用此命令行选项,您将获得具有单线程老年代回收器的多线程年轻代回收器。该选项还执行老年代代的单线程压缩。
下面是用于启动Java2Demo的示例命令行:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

-XX:+UseParallelOldGC
通过该选项,GC 既是多线程年轻代回收器,又是多线程老年代收集器。它也是一个多线程压缩收集器。HotSpot仅在老一代中进行压缩。热点中的年轻一代被认为是复制家;因此,不需要压缩。

压缩描述了以对象之间没有孔的方式移动对象的行为。垃圾回收扫描后,活动对象之间可能会留下孔洞。压实会移动对象,以便没有剩余的孔。垃圾回收器可能是非压缩收集器。因此,并行收集器和并行压缩收集器之间的区别可能是后者在垃圾回收扫描后压缩空间。前者不会。

下面是用于启动 的示例命令行:Java2Demo

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseParallelOldGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

并发标记扫描 (CMS) 回收器

并发标记扫描 (CMS) 回收器(也称为并发低暂停回收器)。它尝试通过与应用程序线程同时执行大部分垃圾回收工作来最大程度地减少由于垃圾回收而导致的暂停。通常,并发低暂停回收器不会复制或压缩活动对象。垃圾回收是在不移动活动对象的情况下完成的。如果碎片成为问题,请分配更大的堆。
注意:年轻代的CMS回收器使用与并行回收器相同的算法。

要启用 CMS 回收器,请使用:
-XX:+UseConcMarkSweepGC
并设置线程数,请使用:
-XX:ParallelCMSThreads=<n>

下面是用于启动Java2Demo的示例命令行:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

G1 垃圾收集器

Garbage First 或 G1 垃圾回收器在 Java 7 中可用,旨在作为 CMS 回收器的长期替代品。G1 收集器是一个并行、并发且增量压缩的低暂停垃圾回收器,其布局与前面描述的其他垃圾回收器完全不同。
要启用 G1 收集器,请使用:
-XX:+UseG1GC
下面是用于启动Java2Demo的示例命令行:

java -Xmx12m -Xms3m -XX:+UseG1GC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

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

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

相关文章

活动目录密码更改

定期更改密码是一种健康的习惯&#xff0c;因为它有助于阻止使用被盗凭据的网络攻击&#xff0c;安全专家建议管理员应确保用户使用有效的密码过期策略更改其密码。 管理员可以通过电子邮件通知用户在密码即将过期时更改其密码&#xff0c;但在许多组织中&#xff0c;用户只能…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

应用层协议——https

文章目录 1. HTTPS 是什么2. 什么是"加密"3. 常见的加密方式4. 数据摘要 && 数字签名5. HTTPS 的工作过程探究5.1 方案1 - 只使用对称加密5.2 方案2 - 只使用非对称加密5.3 方案3 - 双方都使用非对称加密5.4 方案4 - 非对称加密 对称加密5.5 中间人攻击5.6 …

Mac提示文件:已损坏,无法打开。你应该把它移到废纸篓

文章目录 一、电脑信息二、打开任何来源设置三、更改应用程序拓展属性 一、电脑信息 我的是新版的Venture 13的系统。UI改的比较多。与之前的配置还是有很大的区别的。 打开下载的软件&#xff0c;显示已经损坏&#xff0c;打不开。抛开软件本身的问题外&#xff0c;一般是Ma…

【数据结构与算法】TypeScript 实现图结构

class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;68&#xff09;-- 算法导论6.5 7题 七、试说明如何使用优先队列来实现一个先进先出队列&#xff0c;以及如何使用优先队列来实现栈(队列和栈的定义见 10.1 节。) 文心一言&#xff1a; 优先队列是一种数据结构&#xff0c;其中…

无人机机巢有哪些,无人机机场/机场的主要分类

随着无人机技术的飞速发展&#xff0c;无人机已经渗透到了物流、农业、救援、公共安全等多个领域。而为了使这些无人机能更加高效、灵活地运行&#xff0c;一个新的概念应运而生&#xff0c;那就是无人机机巢&#xff08;UAV Nest&#xff09;。复亚智能无人机机巢是一种供无人…

GitLab备份升级

数据备份(默认的备份目录在/var/opt/gitlab/backups/下&#xff0c;生成一个以时间节点命名的tar包。) gitlab-rake gitlab:backup:create新建repo源&#xff0c;升级新版本的gitlab vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.…

【大数据】-- docker 启动 mysql 5.7,开启 binlog

1.说明 mysql binlog&#xff1a;二进制日志文件。它有两个作用&#xff0c;一是增量备份&#xff0c;即只备份新增的内容&#xff0c;可以用于恢复数据&#xff1b;二是用于主从复制等&#xff0c;即主节点维护了一个binlog日志文件&#xff0c;从节点从binlog中同步数据。 …

嵌入式pc技术的特点有哪些?

嵌入式PC技术是将计算机硬件和软件嵌入到各种设备中的一种技术&#xff0c;它具有低功耗、高效率、小型化、易于集成等优点&#xff0c;广泛应用于工业自动化、医疗设备、电力、通信、家用电器、物联网等领域&#xff0c;成为新时代工业生产和社会生活必不可少的技术之一。 嵌入…

使用idea实现git操作大全(在项目开发中遇到的实际情况

使用idea实现git操作大全&#xff08;在项目开发中遇到的实际情况&#xff09; 1.安装git插件2.在开发中切记拉一个自己的分支 1.安装git插件 2.在开发中切记拉一个自己的分支 选中需要拉的分支&#xff0c;右键该分支&#xff0c;选中new breach from “分支”&#xff0c;点…

接口测试如何在json中引用mock变量

在测试接口的时候&#xff0c;有的接口需要测试随机传入大量数据&#xff0c;查看数据库是否正常&#xff0c;但是大量的随机数据全靠自己手写会很慢&#xff0c;而且是通过json传递的数据。 这里我们就可以使用mock生成随机变量&#xff0c;然后在json中引用mock变量 首先看…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

leetcode 135. 分发糖果

2023.8.1 这道题只从前向后遍历会出各种问题&#xff0c;所以最后决定向前向后各遍历一次。 先定义一个饼干数组biscuits&#xff0c;记录每个孩子的饼干数量&#xff0c;初始化每个孩子饼干数量为1。 然后从前向后遍历、从后向前遍历&#xff0c;使其满足“相邻两孩子评分更高…

前端Vue入门-day08-vant组件库

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 vant 组件库 安装 导入 全部导入 按需导入 浏览器配饰 Viewport 布局 Rem 布局适配 vant 组件库 …

NASM汇编

1. 前置知识 1. 汇编语言两种风格 intel&#xff1a;我们学的NASM就属于Intel风格AT&T&#xff1a;GCC后端工具默认使用这种风格&#xff0c;当然我们也可以加选项改成intel风格 2. 代码 1. 段分布 .text: 存放的是二进制机器码&#xff0c;只读.data: 存放有初始化的…

sublime配置less的一些坑(1)

仅在sublime的Install Package安装保存less报错 在sublime的Install Package安装less 打开sublime软件,按住CtrlShiftP组合键,弹出的界面中选择Install Package 选中后enter或者回车。等会弹出一个弹窗,大致意思是说你已经成功安装了package control。如果你在此之前已经安装了…

MySQL之深入InnoDB存储引擎——物理文件

文章目录 一、参数文件二、日志文件三、表结构定义文件四、InnoDB 存储引擎文件1、表空间文件2、重做日志文件 一、参数文件 当 MySQL 实例启动时&#xff0c;数据库会先去读一个配置参数文件&#xff0c;用来寻找数据库的各种文件所在位置以及指定某些初始化参数。在默认情况…

怎么才能远程控制笔记本电脑?

为什么选择AnyViewer远程控制软件&#xff1f; 为什么AnyViewer是远程控制笔记本电脑软件的首选&#xff1f;以下是选择AnyViewer成为笔记本电脑远程控制软件的主要因素。 跨平台能力 AnyViewer作为一款跨平台远程控制软件&#xff0c;不仅可以用于从一台Windows电…

【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】

文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…