面试总结之JVM入门
文章目录
- 🐒个人主页
- 🏅JavaEE系列专栏
- 📖前言:
- 🎀你为什么要学习JVM?
- 🎀JVM的作用
- 🎀JVM的构成(5大类)
- 🏨1.类加载系统
- 🐕类什么时候会被加载?
- 🐕类加载器的分类(具体加载类的执行者)
- 🐕双亲委派机制
- 🪀如何打破双亲委派机制呢?
- 🏨2.运行时数据区
- 🐕程序计数器
- 🐕虚拟机栈
- 🐕本地方法栈
- 🐕堆 (存储空间)
- 🧸堆为什么要进行区域划分?(新生代、老年代)
- 🧸对不同区域垃圾回收的称呼
- 🧸(堆空间参数设置)jvm调优
- 🐕方法区
- 🏨3.本地方法接口
- 🏨4.执行引擎
- 🏨5.垃圾回收
- 🐕Stop the world
- 🐕垃圾回收的相关算法
- 🪀垃圾标记阶段
- 🪀垃圾回收阶段
- 🐕finalize()方法
- 🐕垃圾回收器
- 🪀垃圾回收器的分类
- 🪀CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )
- 🪀G1垃圾回收器(Garbage First)
- 🐒持续更新...
🐒个人主页
🏅JavaEE系列专栏
📖前言:
本篇博客主要以总结面试中对JVM知识的考察点
🎀你为什么要学习JVM?
通过学习jvm,对程序的运行过程更加的了解,提高自己对编码的认识,扩展自己的知识储备,以提高编码规范。它也是中高级程序员必备的知识技能(项目管理、性能调优),先入门为以后铺路。
🎀JVM的作用
1.将.class字节码文件加载到内存中,负责存储数据
2.将字节码解释/编译成计算机能识别的机器码
3.垃圾回收
🎀JVM的构成(5大类)
- 类加载系统(将字节码文件加载到JVM中)
- 运行时数据区(虚拟机栈、堆、方法区、本地方法栈、程序计数器)
- 本地方法接口(负责调用操作系统提供的本地方法)
- 执行引擎(将字节码 解释/编译成机器码)
- 垃圾回收 (回收垃圾数据,释放内存空间)
🏨1.类加载系统
验证:不包含以final修饰的静态变量,因为会把它视为静态常量
🐕类什么时候会被加载?
- 在类中运行main()时
- 创建对象时
- 使用类中的静态变量
- 反射class.forName(“类地址”)
- 初始化子类。导致父类被加载
【注意:final修饰的是常量不会被加载】【 Car[] cars=new Car[10]; 这种情况也不会被加载 】
🐕类加载器的分类(具体加载类的执行者)
大致分为两大类:引导类加载器、其他类加载器(扩展类加载器、应用程序类加载器、用户自定义类加载器)
🐕双亲委派机制
当加载一个类的时候,会先让上一级类加载器
去加载,直到找到引导类加载器,再向下到扩展类加载器中寻找是否可以加载此类,如果不可以,就再向下到应用程序类加载器中找,如果都找不到,就报异常
【好处】:避免了我们自己定义的子类覆盖了系统中的类,双亲委派机制会确保优先调用系统中的类。 eg: (自己定义一个String类,但仍然会调用系统中的String类,而不会调用自己定义的)
🪀如何打破双亲委派机制呢?
可以通过继承ClassLoader类,重写ClassLoader类中的findClass方法,实现自定义类加载。
也可以重写 loadClass 方法(是实现双亲委派逻辑的地方,修改他会破坏双亲委派机制, 不推荐)
eg: Tomcat服务器自定义类加载规则
🏨2.运行时数据区
🐕程序计数器
特点:
内存空间小,jvm中运行速度最快的区域,线程私有的(生命周期同线程一样),不会有内存溢出问题,不会有垃圾回收。
作用:
记录此线程正在执行的位置,以便线程切换后继续执行
🐕虚拟机栈
特点:
线程私有的,存在内存溢出问题,不会有垃圾回收,用来执行方法,栈的基本单位是栈帧(一个栈帧就是一个方法)
栈帧的结构:
(局部变量表、操作数栈、返回方法调用地址…)
🐕本地方法栈
特点:
也是线程私有的,存在内存溢出问题,不会有垃圾回收,用来执行本地方法(就是操作系统提供的方法),修饰的关键字是 native,没有方法体
。它使用C语言写的。
eg:
Object类中的hashCode() 、clone() 、getClass() 、notify() 、notifyAll()、wait() ;
Thread.start()中有一个start0()本地方法、
FileInputStream的read()方法中调用了read0()本地方法
🐕堆 (存储空间)
存放程序中产生的对象,线程共享,存在堆溢出,是垃圾回收的重点区域。
堆的大小可以调节。
堆区域划分:
新生代:
🍓伊甸园区:存放刚刚创建的对象
🍓幸存者1区:进行一次GC,存放伊甸园区以及另一个幸存者区存活的对象,清空这两个区域的垃圾
🍓幸存者2区:进行一次GC,存放伊甸园区以及另一个幸存者区存活的对象,清空这两个区域的垃圾
老年代:
存放超过进行15次垃圾回收仍然存活的对象或 大对象(list中有元素,List就是大对象),垃圾回收频率比新生代慢。(默认是15次,最大也是15次,在对象头中分代年龄占4个比特位,可以自己调节参数)
比例关系:【新生代 : 老年代=2 : 1】【伊甸园 : 幸存者1 : 幸存者2= 8 : 1 : 1】
🧸堆为什么要进行区域划分?(新生代、老年代)
根据对象存活的生命周期进行分区,调整不同区域垃圾回收频率,从而提高垃圾回收效率。还可以对不同区域采用不同的垃圾回收器、垃圾回收算法,对算法扬长避短。
🧸对不同区域垃圾回收的称呼
Minor GC :新生代垃圾回收
Major GC :老年代垃圾回收
Full GC :整堆收集(触发条件:老年区满了 或 方法区满了)
🧸(堆空间参数设置)jvm调优
没有调过,它是根据程序运行的实际需要来进行参数设置,来调整各个区间的比例大小
🐕方法区
存储加载到虚拟机的类信息,方法区的大小可以调整参数,
方法区是线程共享的,会存在内存溢出,可以进行垃圾回收,但是条件非常苛刻: 1.该类实例全部回收 2.该类的类加载器已经回收 3.该类没有在任何地方被引用
🏨3.本地方法接口
本地方法是非java方法,是java调用外部环境的方法,
java提供一个接口,让java可以与其他应用进行交互。
🏨4.执行引擎
是jvm中将字节码 解释/编译为机器码的区域模块。
辨析
:
前端编译: 将.java文件经过JDK中的javac编译成.class文件
后端编译:将.class文件经过JVM中的执行引擎编译成机器码
解释器:一行一行的执行代码。(效率低,但省去了编译时间) eg: 脚本语言html、python…
JIT编译器: (just in time)(及时编译器)将一段代码作为整体进行编译,将结果缓存起来,直接引用。(编译需要花费时间,执行效率高,适合“热点代码段”)
java采用的是半解释半编译的方式,可以先逐行解释执行,到“热点代码”时再对此编译执行并将结果缓存起来,两者结合使用,提高运行效率。
🏨5.垃圾回收
(【垃圾
】没有被任何引用指向的对象成为“垃圾”,它们会占据内存空间)
(【内存溢出
】内存满了,空间不足)
(【内存泄漏
】我们已经不用的对象无法被垃圾回收,仍然占据着内存,导致内存空间越来越小,严重时可引发“内存溢出”)
🐕Stop the world
简称STW,指GC事件发生的过程中,会产生程序的停顿。(停顿产生时,整个应用程序都会暂停,像拍快照)。原因是GC需要先标记垃圾,为了保证数据一致性,以防出现错标、漏标垃圾的情况。
🐕垃圾回收的相关算法
🪀垃圾标记阶段
主要标记哪些对象是垃圾。
引用计数算法:统计每个对象被引用的次数,从而判断此对象是否是垃圾对象。(没有被使用)
(🎀缺点:
1.需要计数,增加空间开销 2.每次需要更新,增加时间开销。
3.无法处理循环引用问题
(P->A->B->C->A,此时只有P是已知的,如果把P断开,ABC就形成了一个孤岛,导致“内存泄漏”)
可达性分析算法:(根搜索算法),有一组“根”对象为起始点,看其他对象是否可达,若不可达则被认为是垃圾对象。
🎀名词解释:
根:虚拟机栈中的引用对象、方法区中的静态变量、所有被synchronized持有的锁对象、java系统中的类
引用链:搜索的路径
🪀垃圾回收阶段
回收阶段目前在JVM中三种常见的算法:复制、清除、压缩
复制算法: 类比两块幸存者区,其中一块B是空的,将另一块A的存活的对象复制到B,把A清空,循环往复,内存碎片少
清除算法: 存活对象位置不变,用列表记录一下垃圾对象的位置,不会把它们清除掉,下次需要使用此内存空间时,直接覆盖掉。适用于老年区,但因为不移动对象,会产生内存碎片。
压缩算法: 将存活的对象重新排列到一端,将剩余区域直接清理。无内存碎片。效率低,适合老年区。
🐕finalize()方法
是Object类中提供的方法,对象垃圾回收前会自动调用此方法,并且finalize()方法只会被调用一次,重写finalize()可能复活对象(相当于复活甲),第二次被回收时不会调用finalize(),直接被回收。
为此定义虚拟机中对象三种状态:
可触及的 :就是可达的,有引用指向的
可复活的 :对象所有引用被释放,但是对象可能在finalize()中复活
不可触及的:对象的finalize()被调用,并没有复活
🐕垃圾回收器
真正进行垃圾回收的执行者。
🪀垃圾回收器的分类
按线程数分类:
🎇单线程: 适用于简单小型场景,只有一个线程进行垃圾回收,GC时,其他应用程序停止工作(STW)
🎇多线程:有多个线程进行垃圾回收
按工作模式分类:
🎇独占式:就是STW,当GC工作时,其他线程停止工作
🎇并发式:GC线程可以和其他用户线程同时工作
按年龄分代分类:
🎇新生代:
🎇老年代:
🪀CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )
目标:追求低停顿 (首个实现垃圾回收线程与其他用户线程同时工作,但不是所有的都是并发执行的,也会有独占执行的时候)
CMS垃圾回收过程:
1.初始标记:STW 独占 会暂停其他用户线程
2.并发标记: 并发 会与其他用户线程同时工作
3.重新标记:STW 独占 会暂停其他用户线程
4.并发清除: 并发 会与其他用户线程同时工作
🪀G1垃圾回收器(Garbage First)
适合多核CPU、大内存大型项目 ,它将每个区域(伊甸园、幸存者1、…)又划分成了更小的区域,哪一个区域垃圾数量多,就优先回收哪一个区域,它可以做到整堆收集管理。当然它也可以做到并发执行。
🐒持续更新…
相关文章:

面试总结之JVM入门
文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀你为什么要学习JVM?🎀JVM的作用 🎀JVM的构成(5大类)🏨1.类加载系统🐕类什么时候会被加…...

适配器模式(Adapter Pattern) C++
上一节:原型模式(Prototype Pattern) C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论 适配器模式(Adapter Pattern)是一种结构型设计模式,它允…...

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店
《美语从头学初级入门篇》 注意:被 删除线 划掉的不一定不正确,只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…...
嵌入式系统在物联网中的应用与发展趋势
嵌入式系统在物联网中的应用与发展趋势 嵌入式系统在物联网中扮演着至关重要的角色,它们是连接物理世界和数字世界的桥梁,实现了物体之间的互联互通。以下是嵌入式系统在物联网中的应用与发展趋势的几个方面: 1. 应用领域 智能家居&#x…...

BTC网络 vs ETH网络
设计理念 BTC 网络 比特币是一种数字货币,旨在作为一种去中心化的、不受政府或金融机构控制的电子货币。其主要目标是实现安全的价值传输和储存,比特币的设计强调去中心化和抗审查。 ETH 网络 以太坊是一个智能合约平台,旨在支持分散的应…...

Android 开发一个耳返程序(录音,实时播放)
本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 AndroidManifast.xml2.编写耳返管理器3. 录音权限申请4. 使用注意 最后我还有一句话要说怕相思,已相思,轮到相思没处辞,眉间露一丝 Android 开发一个耳返程序 耳返程序是声音录入…...

提高办公效率:Excel在文秘与行政办公中的应用技巧
💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在当今信息化时代,Excel作为一款常…...
Object.groupBy分组方法
在某些浏览器的某些版本中,此方法被实现为 Array.prototype.group() 方法。由于 web 兼容性问题,它现在以静态方法实现。 函数功能 提供的回调函数返回的字符串值对给定可迭代对象中的元素进行分组。返回的对象具有每个组的单独属性,其中包…...
从初步的需求收集到详细的规划和评估
综合需求分析建议 明确与细化用户故事 确保每个用户故事清晰、具体,包含角色、目标和成功标准。对用户故事进行优先级排序,以指导开发过程中的功能实现顺序。用户参与和原型制作 创建用户旅程图,以理解用户在使用产品或服务时的整体流程与体验。制作原型或草图,展示用户界面…...

石灰窑工艺流程以及富氧低氧燃烧技术
石灰窑的核心环节是煅烧过程,这是将石灰石转变为生石灰的关键步骤。煅烧反应是碳酸钙(CaCO₃)分解为氧化钙(CaO)和二氧化碳(CO₂)的过程。这一反应需要高温条件,通常在800摄氏度以上…...
LeetCode 2960.统计已测试设备
给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages ,表示 n 个设备的电池百分比。 你的任务是按照顺序测试每个设备 i,执行以下测试操作: 如果 batteryPercentages[i] 大于 0: 增加 已测试设备的计数。 将下标在 …...
vue中component is和keepAlive组合使用
component is用与动态渲染组件 组件基础 | Vue.js <template><div style"padding: 30px"><button click"change(1)">组件1</button><button click"change(2)">组件2</button><button click"chang…...

使用 Koltin 集合时容易产生的 bug 注意事项
来看下面代码: class ChatManager {private val messages mutableListOf<Message>()/*** 当收到消息时回调*/fun onMessageReceived(message: Message) {messages.add(message)}/*** 当删除消息时回调*/fun onMessageDeleted(message: Message) {messages.r…...

CKA认证,开启您的云原生之旅!
在当今数字化时代,云计算已经成为企业和个人发展的关键技术。而获得CKA(Certified Kubernetes Administrator)认证,将是您在云原生领域迈出的重要一步。 CKA认证是由Kubernetes官方推出的权威认证,它旨在验证您在Kuber…...

基于springboot+vue的抗疫物资管理系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

nebula容器方式安装:docker 安装nebula到windows
感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root(God用户类似LINUX的root) 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…...

干洗行业上门预约解决方案,干洗店洗鞋店小程序开发;
互联网干洗店洗鞋店小程序,企业干洗方案,干洗行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发; 一、干洗店洗鞋店小程序核心功能介绍: 1.(支持上门取送、送货到店、寄存网点、智能衣柜四种下单方式) 用户下单-上门取…...
【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联
【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学…...

Mathematica学习笔记收纳
笔记 可以关注官方公众号 帮助文件 https://reference.wolfram.com/language/index.html.zh 南京大学的介绍 https://oi.nju.edu.cn/Mathematica/listm.htm...
java反射高级用列(脱敏+aop)
ClassUtils 、FieldUtils、MethodUtils、ReflectionUtils高级 List<String> list = new ArrayList<>(); Class<?> userClass = ClassUtils.getUserClass(list.getClass()); System.out.println(Collection.class.isAssignableFrom(userClass)); Class<?…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...