当前位置: 首页 > article >正文

八股战神-JVM知识速查

1.JVM组成

JVM由那些部分组成,运行流程是什么?

JVM是Java程序的运行环境

组成部分:

类加载器:加载字节码文件到内存

运行时数据区:包括方法区,堆,栈,程序计数器,本地方法栈

执行引擎:执行字节码,优化代码

垃圾回收器:管理堆内存

运行流程:

加载字节码,准备运行环境,执行字节码,垃圾回收,程序结束

什么是程序计数器

用于记录每个线程正在执行的字节码指令的地址,用于保存字节码行号。当一个线程执行一段字节码到某个位置时,CUP使用权被另一个线程夺走,当前执行的地址会记录下来,当执行权回到当前线程时,会接着上次记录的位置继续执行

介绍Java堆

堆是一个线程共享的区域,主要用于保存对象实例,数组等,堆中内存不够会抛出OOM异常

堆区分为年轻代和老年代,年轻代被化为三部分,一个Eden区和两个S区,一个对象创建后会先到Eden区,如果对象被垃圾回收后还能存活就移动到S0或S1,再经过几次垃圾回收后还能存活则移动到老年代区中,老年代中存的是生命周期比较长的对象,

JDK1.7和1.8堆的区别

1.7中有一个永久代,存类信息,静态变量,常量,编译后代码,1.8移除了永久代,将数据存到本地内存中的元空间区,防止内存溢出

什么是虚拟机栈

每个线程运行时所需要的内存称为虚拟机栈,是一个先进后出结构,每个栈由多个栈帧组成,每个对应着每次方法调用时所占用的内存和数据,每个线程只能有一个活动栈帧,对应了当前正在执行的方法

垃圾回收是否设计栈内存

垃圾回收主要指堆内存,当栈帧弹栈以后,内存就会释放

栈内存分配越大越好吗

未必,默认的栈内存通常为1024k,栈帧过大会导致线程数减少

方法内的局部变量是否线程安全

如果方法内局部变量没有逃离方法的作用范围,那就是线程安全的,变量的创建和销毁都是在当前线程的虚拟机栈中完成的

如果局部变量引用了其他对象并逃离的方法的作用范围,那就要考虑线程安全

栈内存溢出情况

栈帧过多导致内存溢出,如递归调用

栈帧过大导致内存溢出

堆和栈的区别

栈内存一般用来存储局部变量和方法调用,堆用来存储Java对象和数组,堆会用垃圾回收,栈不会

栈内存时线程私有的,堆内存是线程共享的

异常错误不同,内存不足时,栈报StackOverFlow,堆报OutOfMemory

解释方法区

方法区主要存类的信息,运行时常量池,是各个线程共享的内存区域,在虚拟机启动时创建,虚拟机关闭时销毁

方法区在JDK 1.7时在堆区的永久代中,JDK1.8后取消了永久代,单独存在元空间中,避免了在堆区的OOM

解释一下运行时常量池

常量池可以看作一张表,虚拟机指令可以根据这张表找到要执行的类名,方法名,参数类型等信息

当类被加载时,常量池的信息就会放入运行时常量池,并把符号地址转为真实地址

直接内存

不属于JVM的内存结构,是虚拟机的系统内存,常见于NIO操作,用于数据缓冲区,直接内存相当于一块操作系统和Java代码都可以访问到的共享区域,比如我们在文件IO操作中,使用传统的BIO,需要调用操作系统的文件API,涉及到CPU用户态和内核态的切换,资源开销很大,引入直接内存之后,可以通过直接内存建立起系统内存和Java内存的交互传输

 

2.类加载器

什么是类加载器

类加载器的作用是将字节码文件加载到JVM中,从而使Java程序能够运行起来

类加载器有哪些:

启动类加载器,扩展类加载器,应用类加载器(用户自己编写的Java类),自定义类加载器

 

什么是双亲委派机制

加载一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则继续向上委托,如果委托上级都没有加载,则子加载器尝试加载该类

JVM为什么采用双亲委派机制

可以避免一个类被重复加载,当父类加载后则无需重复加载,保证唯一性

为了安全,保证类库API不会被修改

类装载的执行过程

加载:根据类的全名获取类的字节码文件,将其转换为方法区内的运行时数据结构

验证:对字节码进行校验,确保符合JVM规范

准备:为类的静态变量分配内存,设置默认初始值

静态变量是final修饰的基本类型或字符串常量,赋值在准备阶段完成

静态变量是final修饰的引用类型,复制也初始化阶段完成

解析:将符号引用转为直接引用,即将类,方法,字段等解析为内存地址

初始化:执行类的初始化代码,包括静态变量赋值和静态代码块的执行

使用:JVM开始从入口方法执行用户的程序代码,如调用静态类的成员信息,使用new关键字创建对象实例

卸载:当用户程序代码执行完毕后,JVM开始销毁创建的Class对象

3.垃圾回收

简述垃圾回收机制

在Java语言中,有自动的垃圾回收机制,开发者只需要关注内存的申请,内存的释放由系统自动识别完成,不同的对象引用会有不同的回收机制

 

对象什么时候可以被垃圾回收器回收

如果一个对象或多个对象没有任何引用指向它了,那么这个对象现在就是垃圾,就有可能被GC回收

垃圾定位方法

引用计数法:一个对象被引用一次,则在当前对象头上递增一次引用次数,如果引用次数为0,则代表该对象可回收,如果出现循环引用的画计数法就会失效

可达性分析算法:会存在一个根节点,其引用指向下一个节点,依次向下类推,直到所有节点遍历完毕

判断如果某对象和根对象无直接或间接引用则可以被垃圾回收

 

JVM垃圾回收算法

标记清除算法:分标记和清除两个阶段,根据可达性算法通过GCRoot得出垃圾并进行标记,对这些标记为可回收的内容进行垃圾回收,效率高,有磁盘碎片,内存不连续

标记整理算法:标记清除的过程一样,但是会将清理后存活的对象都向内存的一端移动,然后清理边界之外的垃圾,无内存碎片,对象需要移动,效率低

复制算法:将原有的空间一分为二,每次只用其中一块,垃圾回收时,将正在使用的对象复制到另一块内存空间中,然后将当前空间清空,交换两块内存的角色,完成垃圾回收,无碎片,内存使用率低

 

JVM的分代回收

堆被分成两份,新生代和老年代(比例为1:2),对于新生代内部又分Eden区,两个幸存区:From,to

新创建的对象首先被分到Eden区,当Eden区内存不足时,标记Eden区和From区的存活对象并将其复制到to区中,复制完成后,Eden和from中的内存被释放,经过一段时间Eden区内存又不足,标记Eden和to区存活的对象,将存活的对象复制到from区,当幸存区对象熬过几次回收就会晋升到老年代

MinorGC、 Mixed GC 、 FullGC的区别是什么

MinorGC发生在新生代的垃圾回收,暂停时间短

MixedGC发生在新生代和部分老年代区域的垃圾回收。G1收集器持有

FullGC发生在新生代和老年代的完整垃圾回收,暂停时间长,应尽量避免

 

JVM有哪些垃圾回收器

串行垃圾回收器:垃圾回收时,只有一个线程在工作,其他线程都要阻塞等待垃圾回收完成。Serial作用于新生代,采用复制算法,Serial作用于老年代,采用标记整理算法

并行垃圾回收器:多个线程完成垃圾回收工作,其他线程同样阻塞,Parallel New用于新生代,采用复制算法,Parallel Old作用老年代,采用标记整理算法

CMS(并发)垃圾回收器:针对老年代进行垃圾回收,不会造成线程阻塞,会追踪标记整个GCRoot,将其直接关联和间接关联的对象

G1垃圾回收器,作用于新生代和老年代

 

详细聊一下G1垃圾回收器

用于新生代和老年代的垃圾回收,在JDK9后JVM默认用的G1垃圾回收,采用的回收算法是复制算法,分为三个阶段

首先G1将内存划分为多个区域,每个区域都可以充当Elen区,幸存者区。jumongous等

新生代回收:

初始时,所有区域处于空闲状态,创建了一些对象,挑出一部分空闲区左Eden区存储这些对象,当Eden区需要垃圾回收时,挑一个空闲区域做幸存区,用复制算法复制存活对象,需要暂停用户线程,再往后,Eden区内存又不足了,将Eden区以及幸存区的存活对象复制到新的幸存区,将较老的对象晋升至老年代

并发标记:

当老年代占用内存超过阈值(默认45%)后,触发并发标记,无需暂停用户线程,并发标记后会冲标解决漏标问题(此时需要暂停线程),这些都完成后就知道了老年代有哪些存活对象,之后进入混合手机阶段,此时不会堆老年代区域进行回收,而是根据暂停时间目标优先回收价值高的区域

混合收集:

复制完成,内存释放,进入下一轮垃圾回收,如果对象非常大,会开出Jupmgous区存储巨型对象

 

强引用,弱引用,软引用,虚引用

强引用:只要所有的GCRoots能找到,就不会被回收

软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够用时会回收软引用对象

弱引用:需要配合WeakReference使用,只要进行垃圾回收,就会把弱引用回收

虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放内存

 

4.JVM实践

JVM调优参数设置

war包部署在tomcat中设置

jar包部署在启动参数中设置

设置堆空间:-XMS(初始) -XMX(最大)

最大大小为默认物理内存的四分之一,初始大小时物理内存的六十四分之一

堆太小,会导致频繁的年轻代和老年代和垃圾回收,产生stw,用户线程阻塞,太大,可能会导致FullGC,会扫描整个堆空间,暂停用户线程的时间长

虚拟机栈设置:-XSS 每个线程默认1M

新生代中Eden区和两个幸存区的大小比例:默认8:1:1 -XXSus**=9 设置比例

年轻代晋升老年代的阈值: 默认为15,范围0-15

设置垃圾回收期

 

JVM调优工具

命令:

jps:查看进程状态信息

jstack:查看进程内线程堆栈信息

jmap:查询堆栈信息

jhatL堆转存快照工具

jstat:JVM统计监测工具

可视化工具:jconsole:JVM内存,线程,类监控 VisualVM:监控线程,内存情况

 

Java内存泄漏排查思路

使用jmap查询堆栈信息,生成dump文件

通过VisualVM,加载dump文件分析堆栈信息定位到代码排查

 

CPU跑到百分之百,解决思路是啥

通过top命令,定位到占用CPU高的线程

ps -T -p 进程ID找到进程中占比较高的线程

通过jstask查询线程的堆栈信息去定位代码

 

相关文章:

八股战神-JVM知识速查

1.JVM组成 JVM由那些部分组成,运行流程是什么? JVM是Java程序的运行环境 组成部分: 类加载器:加载字节码文件到内存 运行时数据区:包括方法区,堆,栈,程序计数器,本地…...

机试 | STL | string | 文字处理软件

题目&#xff1a; P5734 【深基6.例6】文字处理软件 - 洛谷 不使用库函数 #include<stdio.h> #include <iostream> #include<string> using namespace std;int main() {int q;//第一行输入一个正整数q&#xff0c;表示操作次数string content;//第二行输入一…...

运动规划实战案例 | 图解基于状态晶格(State Lattice)的路径规划(附ROS C++/Python仿真)

目录 1 控制采样 vs 状态采样2 State Lattice路径规划2.1 算法流程2.2 Lattice运动基元生成2.3 几何代价函数2.4 运动学约束启发式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 控制采样 vs 状态采样 控制采样的技术路线源自经典的运动学建模思想。这种方法将机器人的控制指令空…...

深入浅出对抗学习:概念、攻击、防御与代码实践

深入浅出对抗学习&#xff1a;概念、攻击、防御与代码实践 近年来&#xff0c;深度学习在图像识别、自然语言处理等领域取得了巨大成功。然而&#xff0c;研究表明&#xff0c;这些看似强大的模型却异常脆弱&#xff0c;容易受到**对抗样本&#xff08;Adversarial Examples&a…...

Neo4j(二) - 使用Cypher操作Neo4j

文章目录 前言一、Cypher简介二、数据库操作1. 创建数据库2. 查看数据库3. 删除数据库4. 切换数据库 三、节点、关系及属性操作1. 创建节点与关系1.1 语法1.2 示例 2. 查询数据2.1 语法2.2 示例 3. 更新数据3.1 语法3.2 示例 4. 删除节点与关系4.1 语法4.2 示例 5. 合并数据5.1…...

09、供应商管理数字化转型:从潜在评估到战略合作的系统化方法

在全球化竞争和供应链日益复杂的商业环境下&#xff0c;供应商管理已成为企业核心竞争力的关键组成部分。优秀的供应商管理体系不仅能确保物料和服务的稳定供应&#xff0c;更能成为企业创新、降本增效的战略资源。本文将系统性地介绍供应商管理的完整框架&#xff0c;从潜在供…...

AI时代新词-AI增强现实(AI - Enhanced Reality)

一、什么是AI增强现实&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增强现实&#xff08;AI - Enhanced Reality&#xff09;是指将人工智能&#xff08;AI&#xff09;技术与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术相结合…...

批量转存夸克网盘内容并分享实操教程

批量转存夸克网盘内容并分享 经常使用我AI工具&#xff08;圈友互联AI&#xff09;的应该在每日资源这里看到&#xff0c;会每天自动更新最新资源信息&#xff0c;这些资源是自动从各处爬取出来再批量转存进行分享处理的&#xff01; 今天就和大家分享下&#xff0c;如何对夸克…...

Swagger与go-zero框架生成和展示API文档详解

在现代API开发中&#xff0c;清晰、准确的接口文档是前后端协作的重要基础。作为一款功能强大的Go语言微服务框架&#xff0c;go-zero提供了简便的方式来生成Swagger文档&#xff0c;极大地提高了API开发的效率与质量。今天&#xff0c;我们将深入探讨Swagger的作用以及如何通过…...

“安康杯”安全生产知识竞赛活动流程方案

一、竞赛组织部门&#xff1a;排水公司安全生产办公室 二、竞赛说明&#xff1a; 1、由安全生产办公室组编辑、整理&#xff0c;安全生产领导小组审核。竞赛时由公司领导及各部门负责人对本次知识竞赛进行监督评比&#xff0c;以保证竞赛活动的公平、公正。本次竞赛活动由闫红…...

特征分解:线性代数在AI大模型中的核心工具

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

sqlite的拼接字段的方法(sqlite没有convert函数)

我在sqlserver 操作方式&#xff1a; /// <summary>///获取当前门店工资列表/// </summary>/// <param name"wheres">其他条件</param>/// <param name"ThisMendian">当前门店</param>/// <param name"IsNotU…...

【SSL部署与优化​】​​OCSP Stapling配置指南:减少证书验证延迟​​

以下是 通过 Nginx 和 Apache 启用 OCSP Stapling 的详细配置指南&#xff0c;帮助您减少证书验证延迟并提升 HTTPS 性能&#xff1a; 一、OCSP Stapling 核心原理 • 目的&#xff1a;服务器定期从 CA 获取 OCSP&#xff08;在线证书状态协议&#xff09;响应&#xff0c;缓存…...

【C#】Invalidate()的使用

Invalidate()的使用 Invalidate() 是 C# 中用于通知控件需要重新绘制的方法。它通常用于 Windows Forms 应用程序中&#xff0c;当想要更新控件的显示内容时使用。调用 Invalidate() 方法后&#xff0c;系统会安排对该控件进行重绘&#xff0c;这将导致后续调用 OnPaint 方法&…...

理解计算机系统_并发编程(10)_线程(七):基于预线程化的并发服务器

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续理解计算机系统_并发编程(9)_线程(六):读者-写者问题-…...

身份认证: JWT和Session是什么?

一、为什么需要临时凭证&#xff1f; 系统面临三个核心约束&#xff1a; 唯一鉴权方式只有&#xff08;账号&#xff0c;密码&#xff09; 服务端不记录请求状态&#xff0c;服务端不知道用户已登录了 避免重复传输敏感信息&#xff0c;不能每次都携带(账号&#xff0c;密码…...

OpenFOAM 字典系统与求解器配置解析机制

文章目录 OpenFOAM 字典系统与求解器配置解析机制字典系统的基本结构配置文件解析流程字典实现细节1. 字典存储结构2. 条目类型3. 令牌系统4. 解析过程 典型配置文件示例解析字典访问机制高级特性性能考虑 OpenFOAM 字典系统与求解器配置解析机制 OpenFOAM 使用一套独特的字典…...

机器学习中的多GPU训练模式

文章目录 一、数据并行&#xff08;Data Parallelism&#xff09;二、模型并行&#xff08;Model Parallelism&#xff09;1. 模型并行2. 张量并行&#xff08;Tensor Parallelism&#xff09; 三、流水线并行&#xff08;Pipeline Parallelism&#xff09;四、混合并行&#x…...

TPAMI 2025 | CEM:使用因果效应图解释底层视觉模型

底层视觉可解释性专题&#xff1a;https://x-lowlevel-vision.github.io/ 论文&#xff1a;https://arxiv.org/abs/2407.19789 代码&#xff1a;https://github.com/J-FHu/CEM 动机 在底层视觉领域&#xff0c;深度学习模型虽极大提升了任务性能&#xff0c;但其内部运行机…...

小红书文章内容提取免费API接口教程

接口简介&#xff1a; 提取指定小红书文章内容。本接口仅做内容提取&#xff0c;未经作者授权请勿转载。 请求地址&#xff1a; https://cn.apihz.cn/api/caiji/xiaohongshu.php 请求方式&#xff1a; POST或GET。 请求参数&#xff1a; 【名称】【参数】【必填】【说明】 【…...

Halcon 图像预处理②

非线性图像分段变化&#xff1a; 先窗体打开图片 对数非线性变化&#xff1a; 结果图像的亮度/对比度显著增加 log_image(Image,LogImag1,e) 参数1&#xff1a;输入图像 参数2&#xff1a; 输出图像 参数3&#xff1a;底数 log_image(Image,LogImage2,0.1) 图像结果亮度和…...

20250526-C++基础-函数指针

C基础-函数指针 函数指针&#xff0c;顾名思义就是指向函数的指针&#xff0c;用一个变量来存储函数的地址&#xff0c;可以通过这个变量&#xff08;指针&#xff09;间接访问函数。&#xff08;可以把函数指针名看作函数名来进行函数调用&#xff09;。代码及说明如下&#…...

软考 系统架构设计师系列知识点之杂项集萃(73)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;72&#xff09; 第126题 可一次性编程的只读存储器是( )。 A. ROM B. PROM C. EPROM D. EEPROM 正确答案&#xff1a;B。 解析&#xff1a; ROM&#xff1a;出厂时已编程&#xff0c;用户无…...

大模型训练中的GPU作用解析

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助完成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...

Flutter Web 3.0革命:用WebGPU实现浏览器端实时光追渲染,性能提升300%

一、WebGPU为何是图形渲染的未来&#xff1f; 1. 传统WebGL的致命瓶颈 // WebGL 2.0绘制调用示例&#xff08;每秒帧率<45&#xff09; gl.drawElements(gl.TRIANGLES, vertexCount, gl.UNSIGNED_SHORT, 0); 性能对比表&#xff1a; 场景WebGL 2.0WebGPU三角形绘制速率…...

DeepSeek-V3-0526乍现

DeepSeek-V3-0526 可能是 DeepSeek 最新发布的模型版本&#xff0c;相较于之前的 DeepSeek-V3-0324&#xff0c;它在代码能力、推理性能和本地部署方面有了进一步提升。以下是关于该版本的主要信息&#xff1a; - DeepSeek-V3-0526 在多项基准测试中表现优异&#xff0c;性能…...

Java设计模式之观察者模式:从基础到高级的全面解析

文章目录 一、观察者模式基础概念1.1 什么是观察者模式?1.2 观察者模式的四大角色1.3 观察者模式类图二、观察者模式实现步骤2.1 基础实现步骤2.2 详细代码实现第一步:定义主题接口第二步:定义观察者接口第三步:创建具体主题第四步:创建具体观察者第五步:客户端使用三、观…...

C/C++---类型转换运算符

在C中&#xff0c;类型转换运算符&#xff08;Type Conversion Operator&#xff09;允许类对象在需要时自动转换为其他类型。这是一种特殊的成员函数&#xff0c;能够增强类的灵活性和交互性。 1. 基本语法 类型转换运算符的声明格式为&#xff1a; operator 目标类型() co…...

STM32 I2C 通信协议

1、原理 1、硬件电路 一主多从&#xff0c;单片机作为总线主机 SDA&#xff1a;数据线 SCL&#xff1a;时钟线 主机对SCL线完全控制&#xff0c;从机只能读取&#xff1b;在空闲状态下&#xff0c;主机可以主动发起对SDA的控制&#xff0c;只有在从机发送数据和从机应答的时…...

【后端高阶面经:Elasticsearch篇】38、Elasticsearch 高可用架构解析:分片容灾、Translog 调优与双集群

一、高可用架构核心:节点角色与分布式设计 (一)节点角色精细化划分 1. 四大核心节点类型 节点类型核心职责资源配置建议典型部署数量主节点(Master)集群元数据管理(索引创建、分片分配、节点选举)CPU≥4核,内存≥16GB,禁用数据存储3-5个(奇数)数据节点(Data)存储…...