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,以清理和压缩该空间

常用的设置项
| 设置项 | 描述 |
|---|---|
| -Xms | Sets the initial heap size for when the JVM starts. 设置 JVM 启动时的初始堆大小 |
| -Xmx | Sets the maximum heap size.设置堆最大值 |
| -Xmn | Sets the size of the Young Generation.设置年轻代最大值 |
| -XX:PermSize | Sets the starting size of the Permanent Generation.设置永久代的起始值 |
| -XX:MaxPermSize | Sets 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
相关文章:
JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型
详细画的jvm模型图 https://www.processon.com/diagraming/64c8aa11c07d99075d934311 官方网址 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 相关概念 年轻代是所有新对象被分配和老化的地方。当年轻代填满时,这会导致m…...
【elementui】解决el-select组件失去焦点blur事件每次获取的是上一次选中值的问题
目录 【问题描述】 【问题摘要】 【分析问题】 【完整Test代码】 【封装自定义指令】 ↑↑↑↑↑↑↑↑↑↑↑↑ 不想看解决问题过程的可点击上方【封装自定义指令】目录直接跳转获取结果即可~~~ 【问题描述】 一位朋友遇到这么一个开发场景:在表格里面嵌入el-…...
通过了PMP考试,还有什么证书值得考?
自从7月24号公布了PMP成绩后,不少伙伴私信小编:通过PMP后还有哪些证书可以提升自己?一来是多份高含金量的证书可以多点竞争力,二来是加持自己的职业发展!今天小编就来给大家捋一捋! 一.NPDP认证 2016 年 4…...
页面技术基础-html
页面技术基础-html 环境准备:在JDBC中项目上完成代码定义 1. 新建一个 Module:filr->右键 -》Module -》Java-》next->名字(html_day1)->finish 2. 在 Moudle上右键-》第二个选项:add framework .. -> 选择JavaEE下第一个选项 Web Apllicat…...
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28‘ not found
某项目中,我要给别人封装一个深度学习算法的SDK接口,运行在RK3588平台上,然后客户给我的交叉编译工具链是 然后我用他们给我的交叉编译工具链报下面的错误: aarch64-buildroot-linux-gnu-gcc --version /data/chw/aarch64/bin/cca…...
解决SVN或GIT忽略提交文件的问题
背景 使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件。 git 在项目根目录新建文本文件,修改后缀为.gitignore 文件中添加内容 *.iml .project .gradle/ .idea/ target/ build/ .vscode/ .settings/ .facto…...
Django框架之路由用法
简介 路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。 Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。 Django 不同版本 urls.py 配…...
回文链表 LeetCode热题100
题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 思路 利用快慢指针找到链表中间节点,反转后半段链表。前半段从头节点开始与后半段比较。 注意当链表节点…...
如何在群晖NAS中使用cpolar内网穿透
如何在群晖nas中使用cpolar内网穿透 文章目录 如何在群晖nas中使用cpolar内网穿透 今天,我们来为大家介绍,如何在群晖系统中,使用图形化界面的cpolar。 cpolar经过图形化改造后,使用方法已经简便了很多,基本与其他应用…...
无头单向不循环链表和带头双向循环链表的创建
Lei宝啊:个人主页 愿所有美好不期而遇 前言: 接下来我们将会了解最基础的链表--->单链表 以及最方便也是最爽的链表--->带头双向循环链表。 若有看不懂之处,可画图或者借鉴这里:反转单链表,对于数据结构而言&am…...
超简单的fastapi链接websocket用例
main.py from typing import Listfrom fastapi import FastAPI, WebSocket, WebSocketDisconnectapp FastAPI()class ConnectionManager:def __init__(self):# 存放激活的ws连接对象self.active_connections: List[WebSocket] []async def connect(self, ws: WebSocket):# 等…...
MySQL详解
目录 一、MySQL 概述二、MySQL 安装和配置三、MySQL 基础语法四、MySQL 高级语法五、MySQL 性能优化六、MySQL 应用场景和实例七、MySQL 开发工具和插件八、MySQL 学习资源和社区 一、MySQL 概述 MySQL 是一种开源的关系型数据库管理系统,最初由瑞典的 MySQL AB 公…...
Vue [Day2]
指令修饰符 v-model.trim v-model.number 事件名.stop click.stop 事件名.prevent keyup.enter <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…...
【前端|Javascript第1篇】一文搞懂Javascript的基本语法
欢迎来到JavaScript的奇妙世界!作为前端开发的基石,JavaScript为网页增色不少,赋予了静态页面活力与交互性。如果你是一名前端小白,对编程一无所知,或者只是听说过JavaScript却从未涉足过,那么你来对了地方…...
【Linux命令200例】cp用于复制文件和目录(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜…...
C高级_第二讲_shell指令和shell脚本_递归练习
思维导图 递归实现,输入一个数,输出这个数的每一位 int funh(int num){if(0 num){return 0;}else{funh(num/10);printf("%d\n", num%10);} }int main(int argc, const char *argv[]) {puts("请输入一个数");int num 0;scanf(&quo…...
静态路由综合实验
实验拓扑如下: 实验要求如下: 【1】R6为isp,接口IP地址均为公有地址;该设备只能配置IP地址,之后不能再对其进行任何配置 【2】R1~R5为局域网,私有IP地址192.168.1.0/24,请合理分配 【3】所有路由器上环回…...
Spring核心IOC控制反转思想-----Spring框架
import org.junit.Test;public class TestPublic {Testpublic void Test(){//控制反转是一种思想,是为了提高程序扩展力降低耦合度,达到DIP(Dependency Inversion Principle依赖倒置)原则//其核心是将对象的创建权交出去,由第三方容器负责管理,将对象和对象之间的维护权交出去,…...
中小企业如何做好MES管理系统实施建设
中小企业在生产制造领域面临着诸多挑战,包括提升产品竞争力、规范生产制造等。为了应对这些挑战,越来越多的中小企业开始实施MES生产管理系统。然而,由于企业规模小、资源实力不足等原因,很多企业在实施MES管理系统时存在一定的困…...
java环境搭建 Ubuntu Linux
jdk的安装和配置环境变量 使用apt sudo apt install default-jdk若是安装成功了在终端输入java -version来查看是否安装成功 使用官网下载的jdk包 直接在百度上搜索jdk,选择图片这个 网址:jdk下载网址 若是arm就选择带有arm的,反之选择x64的&#…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
