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/9/24 12:25:22 阅读更多 →
如何用AI图层分离技术5分钟完成专业设计工作

如何用AI图层分离技术5分钟完成专业设计工作

如何用AI图层分离技术5分钟完成专业设计工作 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 在数字设计领域,图层分离一直是一项耗时且技术性…

2026/9/23 2:48:35 阅读更多 →
国家中小学智慧教育平台电子课本下载完整指南:三步获取所有教材PDF

国家中小学智慧教育平台电子课本下载完整指南:三步获取所有教材PDF

国家中小学智慧教育平台电子课本下载完整指南:三步获取所有教材PDF 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…

2026/9/25 22:11:54 阅读更多 →

最新新闻

多功能在线报价系统源码解析:PHP+MySQL部署与二次开发实战指南

多功能在线报价系统源码解析:PHP+MySQL部署与二次开发实战指南

简介:一款基于ASP的多功能在线报价系统源码,面向中小企业、电商运营者及需要快速询报价的团队,用于在线生成产品报价单并管理商品、品牌、分类与后台账号,可替代手工Excel报价,减少沟通与改价成本,提升销售…

2026/9/26 4:57:25 阅读更多 →
CH32F USART驱动分层设计与V20x/V30x兼容实践

CH32F USART驱动分层设计与V20x/V30x兼容实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:57:25 阅读更多 →
算力花在刀刃上:FeTS特征感知动态算力分配框架解析

算力花在刀刃上:FeTS特征感知动态算力分配框架解析

1. 为什么我们需要"把算力花在刀刃上"1.1 一个容易被忽略的事实:不同样本、不同特征的算力消耗差异极大先说一个我在实际项目里观察到的现象:同一套模型,处理同一批请求,有的样本跑得快、有的样本跑得慢,但系…

2026/9/26 4:57:25 阅读更多 →
编译原理中的正则表达式与正则定义:词法分析核心解析

编译原理中的正则表达式与正则定义:词法分析核心解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:57:25 阅读更多 →
JMeter安装失败原因:Java环境配置深度解析

JMeter安装失败原因:Java环境配置深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:57:25 阅读更多 →
Git Rebase底层逻辑与实战:提交历史重写、冲突解决与工作流优化

Git Rebase底层逻辑与实战:提交历史重写、冲突解决与工作流优化

做开发这些年,我见过太多人在提交历史上栽跟头。早上刚把分支推到远端,下午想同步 main 分支的最新代码,随手执行一次 merge,提交树立刻变成了一张密密麻麻的蜘蛛网。review 的人面对几十个提交节点根本分不清哪个提交对应哪个需求…

2026/9/26 4:56:25 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →