JVM及垃圾回收机制
文章目录
- 1、JVM组成?各部分作用?
- 1.1 类加载器(Class Loaders)
- 1.2 运行时数据区(Runtime Data Area)
- 1.3 执行引擎(Execution Engine)
- 1.4 本地方法接口(Native Interface)
- 2、类加载机制?
- 2.1、类加载过程
- 2.2、为什么使用双亲委派?
- 2.3、如何打破双亲委派?
- 3、JVM解释执行指令过程
- 4、JVM堆内空间各部分作用?
- 5、垃圾回收
- 5.1YoungGC、FullGC、MinorGc
- Young Generation(新生代)
- YoungGC(Minor GC)
- Full GC(Major GC)
- 5.2、垃圾回收算法-可达性分析法
- 5.2.1标记
- 5.2.2清除
- 5.2.3压缩(可选)
- 5.3、垃圾回收算法-复制(Copy)算法
- 5.3.1、优点
- 5.3.2、缺点
- 5.4、垃圾回收算法-标记-整理法
- 6、垃圾回收器
1、JVM组成?各部分作用?
1.1 类加载器(Class Loaders)
类加载器负责将.class文件加载到JVM中。主要分为三种层次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们按层次关系加载类,保证类的隔离性和重用性。
1.2 运行时数据区(Runtime Data Area)
运行时数据区包括方法区、堆、栈、本地方法栈和程序计数器。堆用于存放对象实例,方法区保存类信息和静态变量,栈存储方法调用信息,本地方法栈用于支持本地方法调用,程序计数器记录当前执行的字节码指令位置。
1.3 执行引擎(Execution Engine)
执行引擎负责将字节码转化为机器码并执行。包括解释器和即时编译器(JIT Compiler)。解释器逐条解释执行字节码,JIT编译器将热点代码编译成本地机器码以提高执行效率。
1.4 本地方法接口(Native Interface)
本地方法接口允许Java代码调用本地方法库中的函数。通过JNI(Java Native Interface)实现。
2、类加载机制?
类加载机制确保类的唯一性和隔离性,采用双亲委派模型。
2.1、类加载过程
当加载一个类时,先由最顶层的Bootstrap ClassLoader尝试加载,若找不到则由下一级的Extension ClassLoader加载,最后由Application ClassLoader加载。这样确保了类加载的一致性和隔离性。


2.2、为什么使用双亲委派?
一是避免重复加载一些class,二是避免JDK的一些class被我们自定义一个类加载器给覆盖掉,设计到安全问题,假如JVM类加载是只要给一个class就能直接加载的话,那么我们自定义一个类加载器,然后给它一个名为java.lang.String的class,里面自定义一些方法,让用户在输入账号密码进行登录的时候给我发一封邮件,这样用户的信息就泄漏了。
2.3、如何打破双亲委派?
在某些情况下,为了实现特定需求,可以通过自定义ClassLoader打破双亲委派模型。例如,Web容器中的类加载机制就需要自定义ClassLoader来隔离不同的Web应用。
3、JVM解释执行指令过程
JVM执行引擎将字节码指令解释为对应的机器码指令,然后交由处理器执行。这个过程包括指令的解码、操作数的获取、指令的执行等步骤。

可以看上图,bipush指令表示将10加载到操作数栈,istore_1表示将10从操作数栈存储到局部变量表下标为1的位置,存入局部变量表索引为1处,iload_1将局部变量表索引为1的位置的数据加载到操作数栈,iadd表示把栈中数据8 和15 出栈进行求和操作后,再放回操作数栈,return 方法结束;
4、JVM堆内空间各部分作用?
JVM堆内存主要分为新生代和老年代:

新生代:分为Eden空间和两个Survivor空间。大部分新创建的对象都存放在Eden空间,经过一次垃圾回收后,存活的对象会被移动到Survivor空间。
老年代:存放长寿命对象,经过多次垃圾回收仍存活的对象会被移到老年代。
JVM规范中规定所有的对象和数组都应该存放在堆中,在执行字节码指令时,会把创建的对象存入堆中,对象对应的引用地址存入虚拟机栈中的栈帧中,不过当方法执行完之后,刚刚所创建的对象并不会立马回收,而是要等JVM后台执行GC后,对象才会被回收。
5、垃圾回收
5.1YoungGC、FullGC、MinorGc
Young Generation(新生代)
新生代(Young Generation)是Java堆内存中的一个区域,通常用于存放刚刚创建的对象。由于大部分对象的生命周期较短,新生代采用了不同的垃圾回收策略以提高效率。Young Generation被进一步划分为三个部分:
Eden Space:刚刚创建的对象被分配到Eden空间。
Survivor Spaces(S0和S1):当进行垃圾回收时,Eden空间中的存活对象会被移动到其中一个Survivor空间,而另一个Survivor空间则用于存放前一次回收时的存活对象。
YoungGC(Minor GC)
YoungGC,也称为Minor GC,是针对新生代进行的垃圾回收。当Eden空间满时,会触发YoungGC。其工作流程包括:
首先,Eden空间中的存活对象会被复制到一个Survivor空间中。
如果Survivor空间满了,或者对象年龄达到一定阈值,存活对象会被移到另一个Survivor空间中。
经过多次YoungGC后,仍然存活的对象会被晋升到老年代。
由于新生代的大小相对较小,YoungGC通常很快完成,但它可能会频繁发生,特别是对于生命周期短的对象。
Full GC(Major GC)
Full GC,也称为Major GC,是针对整个堆内存(包括新生代和老年代)进行的垃圾回收。Full GC会停止应用程序的执行,因此会导致较长的停顿时间。
Full GC的主要目标是清理堆内存中的无用对象,释放出更多的空间。Full GC通常在以下情况下发生:
当老年代空间不足时,会触发Full GC,以清理整个堆内存。
当调用System.gc()方法时,可能会触发Full GC,尽管这并不保证立即触发。
Full GC的性能较差,因此在实际应用中应该尽量避免频繁的Full GC。
5.2、垃圾回收算法-可达性分析法
Java中,垃圾回收器通过判断对象的可达性来确定哪些对象可以被回收。可达性是指从一组称为“GC Roots”(垃圾回收根节点)的对象出发,通过一系列的引用关系,能够到达的其他对象。如果一个对象无法通过任何引用链与GC Roots相连,那么该对象就是不可达的,可以被标记为垃圾并进行回收。
GC Roots通常包括以下几种类型的对象:
- 栈帧中的本地变量与参数:位于方法中的局部变量、输入参数和输出参数。
- 静态类属性:类的静态字段和常量引用。
- 活动线程:正在执行的线程,其中的局部变量与参数也是GC Roots。 基于可达性分析法的垃圾回收过程包括以下几个步骤:
5.2.1标记
从GC Roots开始,通过引用链标记所有可达的对象。这些对象被标记为“存活”。
5.2.2清除
清除所有未标记的对象,即不可达的对象。这些对象被认为是垃圾,可以被回收。
5.2.3压缩(可选)
对堆内存进行整理,将存活对象移到一端,以便提供连续的可用内存。
这种垃圾回收算法具有以下优点:
-
精确性:只回收不可达的对象,避免了误删可能还有用的对象。
-
适用性广泛:适用于大多数情况,不论对象的分布和生命周期如何。
然而,可达性分析法也存在一些潜在的问题: -
效率:在堆内存较大且存活对象较多时,标记阶段可能会占用较多时间。
-
停顿时间:在执行垃圾回收时,程序执行可能会被暂停,影响用户体验。
5.3、垃圾回收算法-复制(Copy)算法
将内存空间分为两块,每次只使用一块,在进行垃圾回收时,将可达对象复制到另外没有被使用的内存块中,然后再清除当前内存块中的对象,后续再按照同样的流程进行垃圾回收。

5.3.1、优点
1、没有标记和清除阶段,通过GC Roots找到可达对象,直接复制,不需要修改对象头,效率高;
2、不会出现内存碎片
5.3.2、缺点
1、需要更多的内存,始终有一半的内存空闲
2、对象复制后,对象的内存地址发生了变化,需要额外的时间修改栈帧中记录的引用地址
3、如果可达对象比较多,垃圾对象比较少,那么复制算法的效率就会比较低,所以垃圾对象多的情况下,复制算法比较适合;
5.4、垃圾回收算法-标记-整理法
当成功标记出内存中的垃圾对象之后,标记压缩法会将所有的存活对象都移动到一个规整且连续的内存空间中,然后执行Full GC(老年代的垃圾回收,或者被称为Major GC)回收无用对象所占用的内存空间。当成功压缩后,已用和未用的内存都各自一遍,彼此之间维系着一个记录下一次分配起始点的标记指针,当为新对象分配内存时,则可以用指针碰撞(Bump the Pointer)技术修改指针的偏移量将新对象分配在第一个空闲内存位置上。

6、垃圾回收器
JVM提供了不同的垃圾回收器,每个回收器有不同的适用场景和性能特点。
Serial收集器:单线程,适用于Client模式。
Parallel收集器:多线程,适用于Server模式。
CMS(Concurrent Mark-Sweep)收集器:并发标记清除,适用于响应时间要求较高的场景。
G1(Garbage First)收集器:将堆划分为多个区域,具有更好的内存管理和垃圾回收控制能力。
相关文章:
JVM及垃圾回收机制
文章目录 1、JVM组成?各部分作用?1.1 类加载器(Class Loaders)1.2 运行时数据区(Runtime Data Area)1.3 执行引擎(Execution Engine)1.4 本地方法接口(Native Interface&…...
windows11不允许安装winpcap4.1.3
问题:下载安装包后在安装时显示与电脑系统不兼容,不能安装。 原因:winpcap是一个用于Windows操作系统的网络抓包库,有一些安全漏洞,存在被黑客攻击的风险。Windows11为了加强系统安全而禁用了这个库,因此不…...
matlab使用教程(23)—优化函数的参数
本博客向您介绍如何存储或访问向 MATLAB 复合函数(如 fzero 或 integral)传递的数学函数的额外参数。 MATLAB 复合函数基于某个值范围计算数学表达式。这些函数之所以称为复合函数是因为它们是接受函数句柄(函数的指针)作为输入…...
基于“互联网+ 服务供应链”的汽车道路救援系统对策分析
1。 建立“互联网服务供应链”背景下汽车道路救援系统 基于互联网的汽车道路救援,两级服务供应链结构是由服务提供商、服务 集成商和客户组成。“互联网服务供应链”背景下汽车道路救援系统组成, 它是一种 B2B2C 的形式,与前述传统汽车道路…...
浅谈泛在电力物联网在电力设备状态在线监测中的应用
安科瑞 华楠 摘要:随着信息化水平的不断发展,泛在电力物联网的建设提上日程,这对提升变电站电力设备在线监测水平,推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究,概括了泛在电力…...
低通滤波器和高通滤波器
应用于图像低通滤波器和高通滤波器的实现 需要用到傅里叶变换 #include <opencv2/opencv.hpp> #include <Eigen> #include <iostream> #include <vector> #include <cmath> #include <complex>#define M_PI 3.14159265358979323846…...
VS中插入Qt插件后配置项目笔记
Project下要创建四个文件夹: bin(输出目录\工作目录) 、include(头文件目录) 、lib(动态库目录) 、src(源码目录) 一、主项目模块配置: 1.配置属性——>常规——>输出目录加入(..\..\bin\) 2.配置属性——>调试——>工作目录加入($(OutDir)) 备注&am…...
Hugo·Stack主题·使用及修改
代码折叠 cp themes/hugo折-themt-saick/exampleSlte/config.yamsclass"codefold"><summary class"codefold__title"><span class"codefold__title-text">" {{ with .Get 0}}{{.}}{{else}}click to expand{{ end }} "&…...
实战:大数据Spark简介与docker-compose搭建独立集群
文章目录 前言技术积累Spark简介Spark核心功能及优势Spark运行架构 Spark独立集群搭建安装docker和docker-composedocker-compose编排docker-compose编排并运行容器 Spark集群官方案例测试写在最后 前言 很多同学都使用过经典的大数据分布式计算框架hadoop,其分布式…...
嵌入性视角下的企业集成创新网络演化过程
从嵌入性角度来看,集成创新网络以社会关系嵌入或结构嵌入的联结方式,实 现创新资源共享。由于规模经济和能力的差异,较高的信息复杂程度往往更强调网 络化和外部组织之间的联合而不是一体化。企业集成创新网络依靠创新网络结点上 企业的合…...
回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现FA-ELM萤火虫算法优化极限学习机多输入单输出回归预测(多指标,多图)效果一览基本介绍…...
数据结构数组栈的实现
Hello,今天我们来实现一下数组栈,学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现,另一端就是栈底。 栈的元素是后进先出。…...
成集云 | 抖店连接器客户静默下单催付数据同步钉钉 | 解决方案
源系统成集云目标系统 方案介绍 随着各品牌全渠道铺货,主播在平台上直播时客户下了订单后不能及时付款,第一时间客户收不到提醒,不仅造成了客户付款率下降,更大量消耗了企业的人力成本和经济。而成集云与钉钉深度合作࿰…...
【算法专题突破】双指针 - 复写零(2)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:1089. 复写零 - 力扣(Leetcode) 我先来读题, 题目的意思非常的简单,其实就是, 遇到 0 就复制一个写进数组&a…...
【Java从0到1学习】11 Java集合框架
1. Collection 1.1 Java类中集合的关系图 1.2 集合类概述 在程序中可以通过数组来保存多个对象,但在某些情况下开发人员无法预先确定需要保存对象的个数,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生信…...
uniapp使用uni.chooseLocation()打开地图选择位置
使用uni.chooseLocation()打开地址选择位置: 在Uniapp源码视图进行设置 添加这个属性:"requiredPrivateInfos":["chooseLocation"] </template><view class"location_box"><view class"locatio…...
学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答
文章目录 课后练习解答需求分解增加KEY3控制代码如下: 第一版代码问题分析Tips:STC-ISP的设置 Tips:定时器实现完整电磁炉显示功能的代码测试流程 总结 课后练习解答 增加按键3,按下后表示启动,选择的对应的功能的LED…...
前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制
一、 栈(stack)和 堆(heap) 栈(stack):是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则,较为经典的就是乒乓球盒结…...
自然语言处理:大语言模型入门介绍
自然语言处理:大语言模型入门介绍 语言模型的历史演进大语言模型基础知识预训练Pre-traning微调Fine-Tuning指令微调Instruction Tuning对齐微调Alignment Tuning 提示Prompt上下文学习In-context Learning思维链Chain-of-thought提示开发(调用ChatGPT的…...
使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化
本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲,主要包括以下内容: NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…...
OpenAI面向欧洲部分用户开放网络安全专用模型GPT-5.5-Cyber,应对AI网络威胁
OpenAI推出欧洲专属网络安全模型 5月12日消息,据eWeek报道,OpenAI正式面向欧洲地区的部分用户开放了网络安全专用模型GPT-5.5-Cyber。该模型基于GPT-5.5架构开发,专为经过OpenAI验证的网络安全防御人员打造。 满足网络安全关键任务需求 GPT-5…...
电子设计协同:跨团队互联规划工具的应用与优化
1. 跨团队互联规划:电子设计协同的破局之道在当今高度复杂的电子系统设计中,芯片(IC)、封装(Package)和印刷电路板(PCB)三大设计团队的协同工作已成为决定产品成败的关键因素。传统设计流程中,这三个团队往往各自为政,通过Excel表…...
AITranslate:本地化AI翻译工作流框架,构建可编程翻译管道
1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫AITranslate。这名字一看就知道,它想用AI来干翻译的活儿。但说实话,现在市面上翻译工具多如牛毛,从老牌的谷歌翻译、DeepL,到各种大厂出的AI翻译插件,…...
构建本地AI记忆系统:五大记忆库与心跳回忆机制详解
1. 项目概述:一个让AI助手真正“记住你”的本地记忆系统 如果你用过OpenClaw、Claude Code或者任何AI助手,肯定遇到过这样的场景:昨天刚跟它详细讨论了一个项目方案,今天再问,它要么含糊其辞,要么又得从头解…...
基于T4技术栈的现代全栈应用开发实践与最佳实践解析
1. 项目概述:一个现代全栈应用的原型与起点最近在GitHub上看到一个挺有意思的项目,叫timothymiller/t4-app。乍一看这个名字,可能有点摸不着头脑,但点进去你会发现,这其实是一个精心设计的全栈Web应用模板。它不是某个…...
EmbedClaw:RAG应用中文本智能分块与向量化检索的工程实践
1. 项目概述:一个面向嵌入向量检索的“机械爪”最近在折腾RAG(检索增强生成)应用,发现向量数据库的检索效果,很大程度上取决于你“喂”进去的文本是怎么被切成一块一块的(也就是分块,Chunking&a…...
可观测性技术栈选型指南:从Prometheus到OpenTelemetry的实践路径
1. 项目概述:一个可观测性技术栈的“藏宝图”如果你正在构建或维护一个现代化的、需要高可靠性的软件系统,那么“可观测性”这个词对你来说一定不陌生。它早已超越了传统的监控,成为确保系统健康、快速定位问题的核心能力。然而,当…...
妙趣AI:开源Agent工具链与AI导航平台的工程实践
1. 妙趣AI:一个AI工具导航与开源Agent生态的实践如果你和我一样,每天被各种新冒出来的AI工具、模型和概念搞得眼花缭乱,同时又对“AI Agent”这个听起来很酷但落地很虚的东西充满好奇,那么“妙趣AI”这个项目可能正是你需要的。它…...
图解人工智能(12)自动做化学实验的机器
近年来,人工智能和传统科学的结合备受瞩目。2019年,英国利物浦大学在《自然》杂志发表论文,介绍了一种可以自动做化学实验的机器人。查找相关资料,并讨论一下类似的工作能给人类社会带来怎样的变革。首先,实验人员的培…...
ESP32音频播放终极指南:从SD卡播放MP3到网络流媒体的完整解决方案
ESP32音频播放终极指南:从SD卡播放MP3到网络流媒体的完整解决方案 【免费下载链接】ESP32-audioI2S Play mp3 files from SD via I2S 项目地址: https://gitcode.com/gh_mirrors/es/ESP32-audioI2S 想要在ESP32上构建专业的音频播放系统吗?ESP32-…...
