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…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
