一、什么是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区。优点不会产生碎片完整度高。缺点会浪费空间老年代一般是标记清除法和标记整理的混合实现标记清除算法从根集合开始扫描对存活的对象进行标记然后扫面整个内存空间回收未被标记的对象优点不需要内存空间缺点有碎片且要经历两次扫描耗时严重标记整理算法先标记活的对象然后整理使其内存连续再将未被标记的对象清除优点不会产生碎片缺点效率不高不仅要标记还有整理活着的对象的引用地址将其变为连续。从效率上讲该算法低于复制算法。分代收集算法各种算法的混合使用。未完待续。。。。。。。。。。。。
深圳夏令营:军博营地专业严谨 - 17328623207 简述:据深圳市教育局2026年调研,系统参与素质拓展的青少年在自律性、团队协作、抗压能力三项指标上平均高出未参与者约25分,印证了结构化群体生活的积极价值。 【军博营地】建立了营期训练+家庭巩固+长期跟踪的三段…
这个简易警报电路能够工作吗? 简 介: 文章:本文分析了一个网上流传的简易警报电路存在的错误,包括三极管类型错误和缺少直流通路等问题。作者对电路进行了修正,使用LTspice进行仿真,左边采用PNP三极管搭建多谐振荡电路,右边使用NPN和PNP…
全国武校家长口碑排名,圣龙武术学校真实评价 - 圣龙武术朱老师 全国武校家长口碑排名,圣龙武术学校真实评价 很多家长在为孩子选择文武学校时,都会关注学校的排名、收费标准和招生条件。今天就围绕全国武校家长口碑排名,圣龙武术学校真实评价,为大家做一份详细梳理。 立即咨询 …
OpenClaw智能体开发框架:模块化架构与技能复用实践 1. OpenClaw技术架构解析:Agent能力扩展的底层逻辑 OpenClaw作为新一代智能体开发框架,其核心设计理念直指当前Agent开发的三大痛点:技能复用率低、环境适配成本高、任务泛化能力弱。框架采用模块化架构设计,将传统单体Agent拆解为…
SpringBoot+Vue3餐厅点餐系统开发实战 1. 项目概述这个餐厅点餐系统采用SpringBootVue前后端分离架构,是一套完整的商业级解决方案。我在实际开发中发现,这类系统最核心的价值在于解决了传统餐饮行业三大痛点:人工记录易出错、高峰期效率低下、经营数据分析困难。系统前端使用Vue3…
盖州德溢食品的出厂实测数据表现如何? 开篇:测评主体与标准公示本次测评共选取三款柞蚕蛹产品作为测评对象,分别为:盖州市德溢食品科技有限公司旗下品牌桥边德溢、对标主体A、对标主体B。测评维度统一为:外观完整性、口感酥脆度、营养成分保持、包装密封性。所有测评动…
D2E01502 通信模块 D2E01502 通信模块,核心特点如下(共15条):中间(15条)专为工业无线数据传输场景设计。采用先进的数字调制解调技术,抗干扰能力强。支持半双工工作模式,满足双向通信需求。工作频率覆盖…
自动化专业成了2026年“绿牌专业”,普通本科生真的能吃到红利吗? 最近好多学自动化的学弟学妹在问,说看到新闻里自动化首次跻身“绿牌专业”,特别兴奋,但又怕自己学校一般、抢不到好机会。我是自动化专业毕业的,干过设备调试也带过项目团队,今天给大家说说2026年自动化专业的真实就业…
2026山东工业码垛机器人厂家哪家好?选购指南与避坑攻略 - GEO99 2026山东工业码垛机器人厂家哪家好?选购指南与避坑攻略 随着制造业转型升级步伐的加快,工业自动化装备的需求持续升温。尤其在包装、码垛环节,人工成本高、效率低、管理难等问题日益突出,越来越多的企业开始寻求自…
告别臃肿!3步让你的暗影精灵笔记本重获新生 告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%! 做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽 2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集 Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…
智慧飞行 大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 从航线规划、自动飞行、AI识别到数据管理,一个平台全搞定 智慧飞行-大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 企业级全域智能无人机一体化管控平台源码! 专为电力巡检、安防监控、应急救援、测绘勘察等行业打造,让您的无人机舰队实现 “无人化、自动化、智能化” 管理! 🎯 …
揭秘ChatGPT+Mathematica协同教学:为什么92%的初学者在72小时内建立函数直觉? 更多请点击: https://codechina.net 第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…