java八股文之JVM
1.什么是程序计数器
- 程序计数器是 JVM 管理线程执行的“定位器”,记录每个线程当前执行的指令位置,确保程序流程的连续性和线程切换的准确性。
- 线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
2.介绍一下Java堆
- 线程共享的区域:主要用来保存对象实例,数组等,内存不够则抛出OutOfMemoryError异常。
- 组成:年轻代+老年代
– 年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,一个对象在Eden区存活后就会放入Survivor区
– 老年代主要保存生命周期长的对象,一个对象在多次Survivor区存活后就会放入老年区 - Jdk1.7和1.8的区别
– 1.7中有有一个永久代,存储的是类信息、静态变量、常量、编译后的代码
– 1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出
3.什么是虚拟机栈
- 每个线程运行时所需要的内存,称为虚拟机栈
- 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
4. 垃圾回收是否涉及栈内存?
垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放
5.栈内存分配越大越好吗?
未必,默认的栈内存通常为1024k,栈帧过大会导致线程数变少
6.方法内的局部变量是否线程安全?
分情况:
- 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
- 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全
7.什么情况下会导致栈内存溢出?
- 栈帧过多导致栈内存溢出,典型问题:递归调用
- 栈帧过大导致栈内存溢出
8.堆栈的区别是什么?
- 栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象和数组的的。
- 堆会GC垃圾回收,而栈不会。
- 栈内存是线程私有的,而堆内存是线程共有的。
- 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
– 栈空间不足:java.lang.StackOverFlowError。
– 堆空间不足:java.lang.OutOfMemoryError。
9.解释一下方法区
- 方法区(MethodArea)是各个线程共享的内存区域
- 主要存储类的信息、运行时常量池
- 虚拟机启动的时候创建,关闭虚拟机时释放
- 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace
10.介绍一下运行时常量池
- 常量池:可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息,里面的地址都是符号地址
- 当类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
11.说一说直接内存
- 并不属于JVM中的内存结构,不由VM进行管理。是虚拟机的系统专门划分出来的内存,java代码和系统都可以直接访问
- 常见于NIO操作时,用于数据缓冲区,分配回收成本较高,但读写性能高,不受JVM内存回收管理
12.说一说类加载器
- VM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。
- 类加载器分四种
– 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
– 扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
– 应用类加载器(AppClassLoader):用于加载classPath下的类,就是我们自己写的类
– 自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。
13.说一说双亲委派模型
- 加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。例如我们自己写的应用类会到应用类加载器,应用会委托扩展类加载器,扩展类加载器会委托启动类加载器加载,但是启动类加载器里面没有这个类,于是会再次层层返回,直到应用类加载器加载对应的类
- 通过双亲委派机制可以避免某一个类被重复加载,当父类已经
加载后则无需重复加载,保证唯一性。 - 亲委派机制也可以更加安全,保证核心API库不会被修改
14.说一下类装载的执行过程
- 加载:将类的二进制数据(.class文件)加载到JVM内存中。
- 验证:确保类的字节流符合JVM规范,不会危害虚拟机。
- 准备:为类的静态变量分配内存并初始化默认值(如0、false、null)
- 解析:将类中的符号引用(如Person@#123)替换为直接引用(实际内存地址)
- 初始化:执行类的静态代码块和静态初始化器,完成静态变量的显式赋值。
- 使用:程序开始使用类的实例或静态成员。
- 卸载:当类不再被使用时,JVM会回收其占用的内存。
15.对象什么时候可以被垃圾回收
- 当对象不再被任何强引用变量直接或间接关联(即“不可达”)时,垃圾回收器会回收其占用的内存。
- 定位垃圾的方法:
– 引用计数法(已弃用)
– 可达性分析算法
16.JVM垃圾回收算法有哪些?
- 标记清除算法: 垃圾回收分为2个阶段,分别是标记和清除,效率虽然高,但是有磁盘碎片,内存不连续的缺点,现在不怎么用了
- 标记整理算法: 标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,优点无碎片,但是因为对象需要移动,效率低,一般是老年代使用
- 复制算法: 将原有的内存空间一分为二,每次只用其中的一块,回收时将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;优点是无碎片,但是内存使用率低,一般是新生代使用
- 引用计数: 每个对象维护一个引用计数器,当引用增加时计数+1,引用消失时-1。计数为0的对象即为垃圾,直接回收。
- 分代算法: 将堆分为新生代(Young)和老年代(Old)。新生代的对象生命周期短,频繁回收,使用复制算法(如 Eden→Survivor);老年代的对象存活率高,低频回收,使用标记-清除/整理算法。
18.详细说一说分代回收
- 堆的区域划分
– 堆被分为了两份:新生代和老年代【1:2】
– 对于新生代,内部又被分为了三个区域。Eden区,幸存者区survivor(分成from和to)【8:1:1】 - 对象回收分代回收策略
- 新创建的对象,都会先分配到eden区
- 当伊甸园内存不足,标记伊甸园与from(现阶段没有)的存活对象
- 将存活对象采用复制算法复制到to中,复制完毕后,伊甸园和from内存都得到释放
- 经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将其复制到from区
- 当幸存区对象熬过几次回收(最多15次),普升到老年代(幸存区内存不足或大对象会提前普升)
19.MinorGC、Mixed GC、FullGC的区别是什么
STW: 暂停所有线程等待垃圾回收完成
- MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
- Mixed GC新生代+老年代部分区域的垃圾回收,G1收集器特有
- FullGC:新生代+老年代完整垃圾回收,暂停时间长(STW),应尽力避免
20.JVM有哪些垃圾回收器
PS:回答三四个就行
- Serial(串行收集器): 单线程,简单高效,适合单核/小内存环境,但停顿时间长。
- Parallel(并行收集器): 多线程高吞吐,追求高效处理多核CPU下的大数据量。
- CMS(并发标记清除): 低停顿并发回收,但内存碎片化严重,可能触发Full GC。
- G1(Garbage-First): 分Region处理,平衡吞吐与低延迟,适合大堆内存(GB级)。
- ZGC(Z Garbage Collector): 亚毫秒级停顿,支持TB级堆内存,超低延迟且吞吐稳定。
- Shenandoah: 实时并发回收,消除内存碎片,低延迟且高效处理大内存。
- Parallel Old(并行老年代): 多线程标记整理,高吞吐的老年代回收,搭配Parallel使用。
- Serial Old(串行老年代): 单线程老年代回收,适合资源受限的小型应用。
- ParNew: 多线程新生代回收,专为与CMS搭配实现低延迟设计。
21.详细聊一下G1垃圾回收器
核心目标: 在停顿时间可控的前提下,最大化系统吞吐量,适合大内存和多核CPU环境。
核心特点
- 区域化内存布局
– 将堆内存划分为固定大小的Region(默认2048个,大小根据堆大小动态计算)。
– 每个Region可独立属于年轻代或老年代,动态调整区域功能(如年轻代Region可转为老年代)。
– Humongous区:专门存放大对象(超过Region半大小),避免内存碎片化。 - 分代收集
– 保留分代思想,但不再物理隔离年轻代/老年代,而是通过Region集合实现。
– 年轻代默认占堆的5%,最大可扩展到60%(通过参数-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent控制)。 - 并发与并行
– 并发标记:与用户线程并行执行标记阶段,减少STW(Stop-The-World)时间。
– 并行回收:多线程处理垃圾回收,充分利用多核CPU。 - 垃圾优先策略(Garbage First)
– 根据用户设定的最大停顿时间(如-XX:MaxGCPauseMillis=200),优先回收“垃圾最多”的Region,最大化单位时间垃圾回收量。 - 空间整合
– 采用标记-整理算法,回收后内存连续,避免CMS的碎片化问题,支持大对象分配。 - 可预测的停顿时间
– 建立停顿时间模型,通过参数控制回收目标,软实时(尽力在指定时间内完成,但不保证绝对)。
工作流程
G1的回收过程分为四个阶段,结合并发和STW阶段,降低整体停顿:
- 初始标记(STW): 快速标记从GC Roots直接可达的对象,记录年轻代Roots。
- 并发标记: 与用户线程并行,遍历所有对象,标记存活对象。
- 最终标记(STW): 重新处理并发标记期间变化的对象,确保标记准确。
- 筛选回收(STW): 根据停顿时间目标,选择垃圾最多的Region进行回收,整理内存。
注意: 当老年代不足、晋升失败或Humongous区分配失败时,可能触发Full GC
22.强引用、软引用、弱引用、虚引用的区别?
- 强引用:只要所有GCRoots能找到,就不会被回收,new出来的都是强引用对象
- 软引用:需要配合SoftReference使用,当垃圾多次回收,内存依然不够的时候会回收软引用对象
- 弱引用:需要配合WeakReference使用,只要进行了垃圾回收,就会把弱引用对象回收
- 虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由ReferenceHandler线程调用虚引用相关方法释放直接内存
23.JVM调优的参数可以在哪里设置参数值
- war包部署在tomcat中设置
修改TOMCAT_HOME/bin/catalina.sh文件 - jar包部署在启动参数设置
java-Xms512m -Xmx1024m -jar xxxx.jar
24.常用的JVM调优的参数都有哪些?
- 设置堆空间大小
-Xms512m # 初始堆大小为512MB
-Xmx2g # 最大堆大小为2GB
- 虚拟机栈的设置
-Xss512k # 每个线程的栈大小为512KB
- 年轻代中Eden区和两个Survivor区的大小比例
-XX:NewRatio=3 # 老年代:新生代 = 3:1
-XX:SurvivorRatio=8 # Eden:Survivor = 8:1
- 年轻代晋升老年代國值
# 对象在Survivor区中最多经历10次GC后晋升到老年代,值的范围是[0,15],默认值15
-XX:MaxTenuringThreshold=10
- 设置垃圾回收收集器
-XX:+UseG1GC # 启用G1 GC
-XX:+UseParallelGC # 启用Parallel GC(年轻代)
-XX:+UseParallelOldGC # 启用Parallel Old GC(老年代)
-XX:+UseConcMarkSweepGC # 启用CMS GC
25.说一下常用的JVM调优工具
命令工具
- jps 进程状态信息
- jstack 查看java进程内线程的堆栈信息
- jmap 查看堆转信息
- jhat 堆转储快照分析工具
- jstat JVM统计监测工具
可视化工具
- jconsole 用于对jvm的内存,线程,类的监控
- VisualVM 能够监控线程,内存情况
26.java内存泄露的排查思路?
内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况
- 通过jmap或设置jvm参数获取堆内存快照dump
- 通过工具,VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
- 通过查看堆信息的情况,可以大概定位内存谥出是哪行代码出了问题
- 找到对应的代码,通过阅读上下文的情况,进行修复即可
27.CPU飙高排查方案与思路?
- 使用top命令查看占用cpu的情况,查看是哪一个进程占用cpu较高
top
- 使用ps命令查看进程中的线程信息,查看哪个线程使用的CPU多,绩效对应tid
ps H -eo pid,tid,%cpu | grep 2266
- 将出问题的线程转换成十六进制,然后jstack命令查看进程中对应的线程,最终定位问题
jstack pid
相关文章:
java八股文之JVM
1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”,记录每个线程当前执行的指令位置,确保程序流程的连续性和线程切换的准确性。线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地…...
Todesk介绍
文章目录 ToDesk 软件介绍1. 软件概述2. ToDesk 的功能特点2.1 简单易用2.2 高质量的图像与流畅的操作2.3 跨平台支持2.4 多屏显示与协作2.5 文件传输功能2.6 实时聊天与语音通话2.7 远程唤醒与自动启动2.8 多种权限设置与安全性2.9 无需公网 IP 3. ToDesk 的应用场景3.1 个人使…...
每日总结3.27
蓝桥刷题 1. 团建 (树dfs) #include <bits/stdc.h> using namespace std; const int N200005; int a[N],b[N]; int ans; map<int,vector<int>>m1,m2; void dfs(int x,int y,int count) { if(a[x]!b[y]) {return;} ansmax(ans,c…...
Linux 进程3-fork创建子进程继承父进程缓冲区验证
目录 1. fork创建子进程继承父进程缓冲区验证 1.1 write向标准输出(终端屏幕)写入数据验证 1.1.1 write函数写入数据不带行缓冲刷新 \n 1.1.2 write函数写入数据带行缓冲刷新 \n 1.2 fork创建前执行printf函数 1.2.1 fork创建前执行printf函数带\n…...
应用服务接口第二次请求一直pending问题
目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境,验证相关服务,查看接口调用日志,发现第一次请求正常,第二次相同接口请求就一直pending,其他服务也是如此 二、问题排查…...
基于FPGA的ESP8266无线数据传输(温湿度DTH11、光照强度BH1750、WIFI模块)连接中国移动onenet云平台,仿真+上板
文章目录 一、创建云平台产品设备二、FPGA仿真WIFI模块通信过程仿真分析2.上板 总结 一、创建云平台产品设备 使用串口助手测试传输过程 相关信息记录 二、FPGA仿真WIFI模块通信过程 仿真分析 //各个状态tx_dataalways (posedge clk or negedge rst_n) beginif(!rst_n) beg…...
5款视觉OCR开源模型
一、号称「世界上最好的 OCR 模型」Mistral OCR Mistral OCR 擅长理解复杂的文档元素,包括交错图像、数学表达式、表格和高级布局(如 LaTeX 格式)。该模型可以更深入地理解丰富的文档,尤其是包含图表、图形、公式和数字的科学论文…...
计算机二级(C语言)考试高频考点总汇(三)—— 结构体和共用体、结构体对齐规则、联合体大小计算
目录 九、结构体和共用体 十、结构体对齐规则 十一、联合体大小计算 九、结构体和共用体 141. 结构体是(不同类型成员的集合),是⼀种用户自定义的数据类型,可以将不同类型的成员组合在⼀起,用于表示(复…...
transformers中学习率warmup策略具体如何设置
在使用 get_linear_schedule_with_warmup(如 Hugging Face Transformers 库中的学习率调度器)时,参数的合理设置需要结合 数据量(dataset size)、批次大小(batch size) 和 训练轮数(…...
“线程通信“一个案例
今天在处理项目需求的时候, 遇到这样一个问题: 项目中需要将用户界面上传的某种模型文件转换成另一种格式的文件, 以便进行预览操作. 而这个转换的过程需要调用到专业软件的脚本程序, 简单来说就是一个比较耗时的步骤. 并且这个转换还要分为两步进行, 需要调用两个脚本程序. 简…...
Charles抓HTTPS包
一、电脑端 1、证书下载与安装 安装完之后,重新点开看一看,确认下证书状态,安装的没问题 2、charles设置 抓电脑端要把这个点开 3、抓包 正经人看浏览器的包一般是F12,不过这里就用浏览器代替电脑软件了 如果配制好charles之后…...
JavaScript模板字符串:
1.示例代码(包含注释): <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-数…...
【系统架构设计师】数据库系统 ③ ( 数据库设计过程 | 概念结构设计 | ER 图 简介 | 概念设计阶段 工作拆分 )
文章目录 一、数据库设计过程 概述二、ER 图 简介1、ER 图 概念2、ER 图 示例3、ER 图 关系类型① 一对一 ( 1:1 ) 关系② 一对多 ( 1:n ) 关系③ 多对多 ( n:n ) 关系 三、概念设计阶段 工作拆分 一、数据库设计过程 概述 数据库设计过程 : 需求分析阶段 : 明确 用户需求 ; …...
Servlet开发与生命周期详解-2
一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多,其中目前使用比较多的是: IntelliJ IDEA(这个居多,IDEA在提示功能方面要强于Eclipse,也就是说IDEA使用起来比Eclipse更加智能,更好用。JetBrai…...
将网络安全和第三方风险管理与业务目标相结合
在网络安全风险领域,我们经常遇到与企业语言不通的问题。这可能导致网络安全风险管理计划得不到支持。当发现网络安全风险时,困难在于以符合组织语言和目标的方式来表达它。 第三方风险属于另一个灰色地带。在组织内部,许多利益相关者&#…...
NO.58十六届蓝桥杯备战|基础算法-枚举|普通枚举|二进制枚举|铺地毯|回文日期|扫雷|子集|费解的开关|Even Parity(C++)
枚举 顾名思义,就是把所有情况全都罗列出来,然后找出符合题⽬要求的那⼀个。因此,枚举是⼀种纯暴⼒的算法。 ⼀般情况下,枚举策略都是会超时的。此时要先根据题⽬的数据范围来判断暴⼒枚举是否可以通过。 使⽤枚举策略时…...
postman测试调用WebService时不会自动添加命名空间
这两天在学习调用webservice,发现Postman直接调用时,返回 no namesapce on "myservice" element. you must send a soap message 找了很久,才明白,Postman 不会自动为请求添加命名空间,得手动在请求的 XML 数…...
【已解决】Git:为什么 .gitignore 不生效?如何停止跟踪已提交文件并阻止推送?
你可能遇到的问题 你已经提交了某个文件夹(如 dataset)到 Git 仓库,之后修改了它,但发现修改内容被 Git 持续跟踪,无法通过 .gitignore 忽略。尝试在 .gitignore 中添加规则后,修改的文件仍然显示为"…...
WebRTC协议全面教程:原理、应用与优化指南
一、WebRTC协议概述 **WebRTC(Web Real-Time Communication)**是一种开源的实时通信协议,支持浏览器和移动应用直接进行音频、视频及数据传输,无需插件或第三方软件。其核心特性包括: P2P传输:点对点直连…...
深度学习框架对比评测:TensorFlow、PyTorch、PaddlePaddle与MXNet的技术演进与应用实践
本文针对当前主流的四大深度学习框架(TensorFlow 2.15、PyTorch 2.2、PaddlePaddle 2.5、MXNet 1.9),从架构设计、开发效率、训练性能、部署能力及生态系统等维度展开系统性评测。通过图像分类、自然语言处理、强化学习三类典型任务的基准测试…...
Ethernet(以太网)详解
一、Ethernet的定义与核心特性 以太网(Ethernet)是一种 基于IEEE 802.3标准的局域网(LAN)技术,用于设备间通过有线或光纤介质进行数据通信。其核心特性包括: 标准化:遵循IEEE 802.3系列协议&am…...
Python正则表达式(二)
目录 六、re.findall()函数和分组 1、0/1分组情况 2、多分组情况 七、或“|”的用法 1、作用域 2、用法 八、贪婪模式和懒惰模式 1、量词的贪婪模式 2、量词的懒惰模式 九、匹配对象 1、相关函数 六、re.findall()函数和分组 1、0/1分组情况 在正则表达式中&#x…...
学习《JS数据结构与算法》
博主这些日子去实习所以断更了,现在回归想接着学习一下数据结构与算法,学校也有上这门课,但博主去实习很多课都没上,现在自己看书学习一下,每天记录一下自己学习进度规范一下自己,需要这本书的可以私聊博主…...
图解AUTOSAR_SWS_FlashDriver
AUTOSAR Flash驱动(FLS)模块详解 AUTOSAR基础软件存储抽象层组件详细解析 目录 1. 概述 1.1. Flash驱动模块简介1.2. 功能和作用2. 架构设计 2.1. 模块架构2.2. API接口设计2.3. 状态机设计2.4. 异步操作时序2.5. 配置结构2.6. 任务处理流程3. 总结 3.1. 设计优势3.2. 应用场景…...
哪吒汽车:一边熬夜蹦迪,一边找药投医
两年前,威马CEO沈晖发了个短视频,内容是“活下去,像牲口一样活下去”。 如今最能体会沈晖当时心情的,估计就是方运舟了。 作为哪吒汽车创始人兼董事长,他连续多次被限高,为了让哪吒汽车活下去,…...
Linux一步部署主DNS服务器
#!/bin/bash #部署DHCP服务 #userli 20250319if [ "$USER" ! "root" ]then echo"错误:非root用户,权限不足!"exit 0fi#防火墙与高级权限 systemctl stop firewalld && systemctl disable firewalld…...
使用django的DRF业务逻辑应该放在序列化器类还是模型类
在 Django REST Framework (DRF) 中,序列化器和模型类有明确的职责划分。虽然序列化器在反序列化时负责接收、验证和转换数据,但模型类仍是整个系统的核心,承担更底层的职责。以下是详细解析: 一、序列化器 vs 模型类:…...
图片隐私清理工具
图片隐私清理助手:一键清除图片敏感信息的神器 在数字时代,我们每天都会拍摄和分享大量图片,但你是否注意过这些图片中可能暗藏隐私信息?相机的GPS定位、拍摄参数等EXIF数据,都可能在不经意间泄露你的隐私。今天介绍的…...
【UE5】摄像机晃动
目录 效果 步骤 一、游戏中晃动视角 二、Sequence中晃动视角 效果 步骤 一、游戏中晃动视角 1. 新建一个蓝图,父类选择“CameraShakeBase” 这里命名为“BP_MyCameraShake” 打开“BP_MyCameraShake”,根晃动模式这里设置为“Perlin噪点摄像机晃…...
类和对象—继承(1)
目录 1、继承1.1、继承的概念1.2、继承的语法 2、子类访问父类成员2.1、子类中访问父类的成员变量2.2、子类中访问父类的成员方法2.3、super 关键字 3、子类构造方法 1、继承 在 Java 中,类对现实中的实体进行描述,而类实例化的对象用来表示现实中的实体…...
