Java虚拟机入门知识以及面试常见题
一、什么是JVM虚拟机JVM是Java Virtual MachineJava虚拟机的缩写是一种用于计算机设备的规范它是一个虚构出来的计算机通过在实际计算机上仿真模拟各种计算机功能来实现的。只要计算机设备上安装了JVM就可以执行编译后的字节码文件.class并可跨平台使用。JVM的五大模块类装载器负责加载class文件运行时数据区执行引擎负责解释命令并提交操作系统执行本地方法接口融合不同的编程语言为Java所用通常为C/C垃圾收集器二、运行时数据区虚拟机栈每执行一个方法就会有该方法的一个栈帧入栈执行完出栈遵循“先入后出”主方法栈帧总是最后出栈本地方法栈本地方法库中的方法不是java代码堆存对象字符串常量池程序计数器元数据区方法区类信息“栈管运行 堆管存储”1、虚拟机栈每个java方法在被调用的时候就会创建一个栈帧并入栈一旦方法调用结束就出栈。其生命周期是随着线程的创建而创建随线程结束而释放是线程私有的因此不存在垃圾回收的问题。遵循“先进后出”原则。以一个java程序为例子解释一哈public class Test { public static void main(String[] args) { doit1(); doit3(); } public static void doit1() { doit2(); } public static void doit2() { //方法体 } public static void doit3() { //方法体 } }稍作解释一个java程序入口为主方法因此一定主方法的栈帧先入栈调用doit1()时doit1()栈帧入栈在doit1()中调用了doit2(),doit2()方法入栈执行完后出栈继续执行doit1()方法doit1()方法执行完毕出栈继续执行main方法main方法调用doit3()doit3栈帧入栈执行完后出栈继续main方法main方法执行完毕该程序执行完毕。栈帧栈帧中主要是局部变量表、操作数栈、动态链接、返回地址局部变量表主要存放byte、short、int、float、char、boolean、reference(指的是方法中的局部变量的对象引用)、returnAdress虚拟机数据类型单位是slotlong和double型变量占2个slot通过索引定位的方式使用局部变量表索引值范围从0开始在方法的执行过程中使用局部变量表完成参数值到参数列表的传递过程局部变量是没有初始值的操作数栈遵循“先进后出原则”方法的执行操作在操作数栈中完成每一个字节码指令往操作数栈进行写入和提取的过程就是入栈和出栈的过程操作数栈的每个元素是可是是任意的数据类32位数据类型所占栈容量为1,64位数据类型所占的栈容量是2当一个方法开始执行时这个方法的操作数栈数空的在方法的执行过程中通过一些字节码指令从局部变量表或者对象实例字段中复制常量或者变量值到操作数栈中当方法执行完后操作数栈为空。动态链接每个栈帧都包含一个执行运行时常量池JVM运行时数据区域中该栈帧所属方法的引用持有这个引用是为了支持方法调用过程中的动态链接在Class文件格式的常量池存储字面量和符号引用中存有大量的符号引用1、类的权限定名 2、字段名个属性 3、方法名和属性字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载过程的解析阶段的时候转化为直接引用这里称为静态解析。另外一部分将在每一次的运行期间转换为直接引用这部分呢称为动态链接。方法返回地址当一个方法开始执行后只有两种方法可以退出这个方法。一执行引擎遇到任意一个方法的字节码指令这时候可能会有返回值传递给上层的方法调用者调用当前方法的方法称为调用者是否有返回值和返回值类型将根据遇到何种方法返回指令来决定这种退出方式称为正常完成出口二在方法的执行过程中遇到了异常并且这个异常没有在方法体内得到处理无论是java虚拟机内部产生的异常还是代码中使用抛出字节码指令而产生的异常只要在本方法中的异常处理器表中没有搜索到匹配的异常处理器就会导致方法退出这种退出称为异常完成出口该退出方式是不会给上层调用者任何返回值。无论采用哪种退出方式在方法退出后都需要返回到方法被调用的位置程序才能继续执行方法返回时可能需要在栈帧中保存一些信息用来帮助恢复它的上层方法的执行状态。一般来说方法正常退出时调用者的程序技术器的值可以作为返回地址栈帧中很可能会保存这个计数器值。而方法异常退出时返回地址是要通过异常处理器表来确定的栈帧中一般不保存这个信息、方法退出的过程实际上就等同于把当前栈帧出栈因此退出时可能执行的操作恢复上层方法的局部变量表和操作数栈把返回值如果有的话压入调用者栈帧的操作数栈中调整程序计数器的值以指向方法调用指令后面的一条指令等。均是参考的一个写的很好的简书https://www.jianshu.com/p/ecfcc9fb1de7当虚拟机栈满了之后会出现java.lang.StackOverflowErrorpublic static void main(String[] args) { doit(); } public static void doit() { doit(); }2、堆Java程序在运行时创建的所有类型对象个数组都存储在堆中。JVM会根据new指令在堆中开辟一个确定类型的的对象内存空间堆中开辟对象的空间并没有任何人工指令可以回收而是通过JVM的垃圾回收器负责回收。堆中对象存储的是该对象以及对象所在超类的实例数据但不是静态数据其中一个对象的引用可能在整个运行时数据区中的很多方法存在比如栈、堆、方法区等堆中对象还在关联一个对象的锁数据信息以及线程的等待集合线程等待池这些都是实现Java线程同步机制的基础java中数组也是对象在堆中会存储数组的信息堆内存如下新生代是new一个对象诞生、成长、消亡的区域一个对象在这里产生、应用最后被垃圾回收器收集结束生命。伊甸区所有的对象都在此被new出当伊甸区的空间用完而程序还在创建对象JVM的垃圾回收器对其进行垃圾回收Minor GC将伊甸区不再所引用的对象进行销毁然后将剩余的移动到幸存0区当幸存0区满了JVM垃圾回收器也会对其进行垃圾回收Minor GC移动到幸存1区依次类推。若老年代养老区满了JVM对其执行Full GC垃圾回收若依旧无法保存对象则会发生OOM异常OutOfMemoryError发生OOM异常的原因JAVA虚拟机的堆内存设置不够可以通过-Xmx、-Xms进行调整代码中创建了大量对象且长时间不能不能进行回收public static void main(String[] args){ long maxMemory Runtime.getRuntime().maxMemory();//返回JVM试图使用的最大内存量 long totalMemory Runtime.getRuntime().totalMemory();//返回JVM中的内存总量 System.out.println(MAX_MEMORY maxMemory (字节) (maxMemory/(double)1024/1024) MB); System.out.println(TOLAL_MEMORY totalMemory (字节) (totalMemory/(double)1024/1024) MB); } //输出 MAX_MEMORY 937951232(字节)894.5MB TOLAL_MEMORY 64487424(字节)61.5MB将堆内存调成800M-Xmx800m -Xms800m -XX:PrintGCDetails//输出 MAX_MEMORY 804257792(字节)767.0MB TOLAL_MEMORY 804257792(字节)767.0MB模拟下堆内存溢出OOM将对内存调成8M-Xmx8m -Xms8m -XX:PrintGCDetails执行如下代码public static void main(String[] args){ String str 模拟堆内存溢出; while(true) { str str new Random().nextInt(88888888) new Random().nextInt(999999999); } }则会出现OOM异常这是在执行上述代码时垃圾回收的一个过程3、垃圾回收机制VM参数-Xmx1024m -Xms1024m -XX:printGCDetails-Xms设置初始分配大小默认为物理内存的1/64-Xmx设置最大分配内存默认为物理内存的1/4-XX:printGCDetails输出详细GC处理日志GC频繁收集新生代较少收集老年代基本不动perm区Minor-GC普通GC只针对新生代Major-GC或者Full-GC针对老年代偶尔伴随对新生代的GC以及对永久代的GC一般是自动出发垃圾回收主要的垃圾回收算法复制算法标记-清除算法标记-整理算法分代收集算法新生代当对象在Eden包括一个Survior区域这里为from区出生后在经过一次Minor GC后如果对象还存活并且能被另外一块Survior区所容纳to区即to区有足够的内存空间存储Eden和from区的存活对象则使用复制算法将这些存活的对象复制到另一块Surviorto区然后清理所有使用的Eden以及from区并且将这些对象的年龄设置为1以后对象在survior区每熬过一次Minor GC就将其年龄加1当年龄达到某个值时一般为15这些对象就会成为老年代。Eden区的对象的存活率不高一般使用10%的内存作为空闲和活动区而另外80%的内存则用来给新new的对象分配内存一旦发生GC将10%的活动区间与另外80%中存活的对象转移到10%的空闲空间然后用90%的内存将被释放依次类推Edenfromto 8:1:1. 谁空谁为to区复制算法将内存分为两块每次只用其中一块当这块内存用完就将还活着的对象复制到另外一块。无论如何有一个区是空的谁空谁就是to区。优点不会产生碎片完整度高。缺点会浪费空间老年代一般是标记清除法和标记整理的混合实现标记清除算法从根集合开始扫描对存活的对象进行标记然后扫面整个内存空间回收未被标记的对象优点不需要内存空间缺点有碎片且要经历两次扫描耗时严重标记整理算法先标记活的对象然后整理使其内存连续再将未被标记的对象清除优点不会产生碎片缺点效率不高不仅要标记还有整理活着的对象的引用地址将其变为连续。从效率上讲该算法低于复制算法。分代收集算法各种算法的混合使用。未完待续。。。。。。。。。。。。

相关新闻

OpenCore Legacy Patcher:三步免费解锁老Mac的macOS新系统体验

OpenCore Legacy Patcher:三步免费解锁老Mac的macOS新系统体验

OpenCore Legacy Patcher:三步免费解锁老Mac的macOS新系统体验 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为手中的老款Mac无法升级…

2026/7/29 21:14:38阅读更多 →
Playwright自定义Fixtures:解决测试数据管理与环境隔离的工程实践

Playwright自定义Fixtures:解决测试数据管理与环境隔离的工程实践

1. 项目概述:为什么我们需要自定义 Fixtures?如果你在用 Playwright 做自动化测试,大概率已经熟悉了它的test函数和page对象。官方提供的test和page这些内置 Fixtures 确实方便,开箱即用。但当你开始构建一个稍具规模的测试套件时…

2026/7/30 0:52:20阅读更多 →
Ryujinx模拟器终极指南:3步在PC上畅玩Switch游戏

Ryujinx模拟器终极指南:3步在PC上畅玩Switch游戏

Ryujinx模拟器终极指南:3步在PC上畅玩Switch游戏 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验Switch独占大作却不知从何入手?Ryujinx模拟器为…

2026/7/28 18:22:07阅读更多 →
LangGraph框架解析:构建高效AI Agent的实践指南

LangGraph框架解析:构建高效AI Agent的实践指南

1. LangGraph:新一代Agent开发框架全景解读当我在2023年首次接触LangGraph时,这个由LangChain团队推出的框架还只是GitHub上的一个实验性项目。如今它已经成长为构建生产级AI Agent的首选工具,其独特的StateGraph设计理念彻底改变了传统Agent…

2026/7/30 5:27:52阅读更多 →
AI重新定义Web3:去中心化应用的智能开发范式与价值分配变革

AI重新定义Web3:去中心化应用的智能开发范式与价值分配变革

AI重新定义Web3:去中心化应用的智能开发范式与价值分配变革 一、引言 AI 正在被用于 Web3 的开发工具、交互和数据处理环节,但各项目的技术成熟度差异很大。本文讨论 2027 年可能出现的五类技术变化;它们是基于公开技术方向的条件性推演&am…

2026/7/30 5:27:52阅读更多 →
无限畅享无损音质,含三大高品质音源,听歌下载两不误!

无限畅享无损音质,含三大高品质音源,听歌下载两不误!

这是一款完全免费的安卓音乐应用,不仅能够在线聆听无损音源,还支持将歌曲离线缓存,涵盖128k与320k标准MP3音质,以及FLAC无损高清音频格式,软件内部搭载三条稳定优质音源线路。 你只需在搜索栏输入心仪歌手名称或者曲目…

2026/7/30 5:27:52阅读更多 →
深入解析RS-232/422/485串口通信:从差分信号到Modbus实战

深入解析RS-232/422/485串口通信:从差分信号到Modbus实战

1. 从“电火花”到“比特流”:串口通信的底层逻辑如果你拆开过任何一台工业设备、工控主板,或者老式的台式机,大概率会看到一排9针或25针的D型接口,旁边可能标着“COM”或“SERIAL”。这就是串口,一个在USB和网络大行其…

2026/7/30 5:27:52阅读更多 →
Matlab/Simulink UDP通信实战:从概念到工程应用全解析

Matlab/Simulink UDP通信实战:从概念到工程应用全解析

1. 项目概述:为什么要在Matlab/Simulink里折腾UDP通信?如果你正在做机器人控制、自动驾驶算法验证、硬件在环(HIL)测试,或者任何需要把Matlab/Simulink这个强大的算法仿真环境,和外部真实世界(比…

2026/7/30 5:27:52阅读更多 →
信赖域优化方法:从核心原理到Python实现详解

信赖域优化方法:从核心原理到Python实现详解

1. 项目概述:从“走一步看一步”到“谋定而后动”的优化哲学在解决工程、金融、机器学习等领域的复杂优化问题时,我们常常面临一个核心矛盾:如何平衡“局部探索”的精度与“全局推进”的效率?想象一下,你在一片浓雾笼罩…

2026/7/30 5:25:52阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →