首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
JVM的构成精讲
📅 2026/10/28 2:00:22
✍️ 爱科研究院
👁 阅读 3,247
类加载器把class文件从 磁盘/网络 拉进来放到内存准备好运行时数据区内存的仓库存放代码、变量等执行引擎把Java字节码转化成机器可执行的代码本地方法接口负责调用外部代码eg.C等运行时数据区虚拟机栈栈帧每调用一个Java方法就压入一个栈帧方法正常返回或者异常退出栈帧都弹出内存固定大小也可以动态扩展eg-Xss设置虚拟机栈大小比如-Xss256k 栈不是存对象的对象在堆栈里存的是对象引用。局部变量表1.存方法参数、方法内定义的局部变量2.是一组Slot变量槽[ 一个slot 32 bit ]3.局部变量表在编译期就确定了长度运行期间大小不变4.GC可达性局部变量表里面的引用就算代码走到后面不用了只要引用还在 slot 里GC 就不会回收对象可以手动a null辅助回收或者用javac -g调试信息、JIT 优化擦除引用操作数栈1.是临时数据栈基于栈式指令集用来做计算、传参2.也是编译期确定最大深度3.对比寄存器架构x86/ARM是用寄存器JVM 是栈式架构指令简单、可移植缺点指令多。4.图 1 中的压 1 压 2 指的是压入【当前栈帧的操作数栈】动态链接Java 编译成 class 字节码的时候不知道方法 / 字段在内存里的真实地址只能写符号引用动态链接就是在方法运行时把栈帧里保存的符号引用翻译成直接引用内存地址的过程方法返回地址方法执行完之后回到调用者方法的位置方法返回地址记录的就是这个位置正常退出执行return系列指令返回值压到调用方操作数栈异常退出没有返回值异常要往上抛靠异常表处理注意异常不属于返回地址栈帧里有独立的异常处理逻辑。方法调用流程举例本地方法栈本地方法用native关键字修饰的 Java 方法方法体不是 Java 写的是 C/C 等原生语言写的放在外部动态库.so/.dll/.dylib里这个方法只有声明没有 {} 方法体本地方法栈专门给 JNI 本地方法native方法服务的栈和 Java 虚拟机栈是一对1.存储本地方法的栈帧C/C 的栈帧不是 Java 栈帧 本地方法的局部变量 方法返回地址 函数调用上下文 JNI 调用相关信息 //⚠️ 注意不是存 Java 对象是原生代码的调用栈。2.可能抛出的异常StackOverflowError线程调用本地方法时栈深度超过允许的最大栈深度OutOfMemoryError本地方法栈动态扩展扩展时内存不够很多虚拟机HotSpot里本地方法栈和虚拟机栈共用一块内存所以这两个栈的 OOM / StackOverflow 经常放一起讨论。3.HotSpot一句话JVM 是接口HotSpot 是这个接口最主流的实现类。JVM 是一套规范Specification只定义运行时数据区、字节码、指令集等抽象规则HotSpot 是 Oracle 官方默认的 JVM 实现就是我们平时用的 JDK8、JDK17 默认的虚拟机我们日常说的 JVM 调优参数-Xss、-Xmx、-Xms、-XX:UseG1GC全部都是 HotSpot 的参数HotSpot 没有单独给本地方法栈做独立的内存区域虚拟机栈 本地方法栈合二为一-Xss参数同时控制这两个栈的大小所以你调-Xss既改 Java 方法栈大小也影响本地方法栈堆堆是JVM 中最大的一块内存区域唯一目的存放对象实例 数组是 GC 垃圾回收的主战场线程共享启动时分配可通过-Xms初始堆、-Xmx最大堆控制大小整体结构Heap ├─ Young 新生代 //存放刚创建、生命周期短的对象GC 频率很高这里的 GC 叫 Minor GCYGC │ ├─ Eden 伊甸区 │ ├─ S0 From Survivor │ └─ S1 To Survivor └─ Old 老年代 //存放长期存活、大对象Major GC / Full GC开销远大于 YGC速度慢很多。 Full GC 之后还是放不下 → OOMjava.lang.OutOfMemoryError: Java heap space //比例默认Eden : S0 : S1 8 : 1 : 1可以用 -XX:SurvivorRatio修改 //新生代占整个堆默认 1/3老年代 2/3-XX:NewRatio 调整JDK8 移除了永久代改用元空间Metaspace直接在本地内存不在堆里永久代PermGen JDK7 及之前放类信息的地方在堆里面元空间Metaspace JDK8 之后替代永久代不在堆里用操作系统本地内存具体下面方法区部分有涉及新生代分配规则对象优先分配在EdenEden满了YGC存活的对象复制到 To Survivor...再次触发YGCEden From Survivor里存活的对象复制到To 互换角色S0 S1来回切换1.✅ 一句话理解互换From 是存存活对象的那个To 是空的目的地每次 YGC 完两者身份交换。2.对象在 Survivor 熬过一定次数 GC默认 15 次-XX:MaxTenuringThreshold晋升到老年代方法区注意方法区是《Java 虚拟机规范》里定义的逻辑区域不是物理内存不同虚拟机实现不一样最常用的 HotSpot 有两个大版本变化JDK1.7 及以前永久代PermGen属于堆的一部分JDK1.8元空间Metaspace直接使用本地内存Native Memory不再在堆里存什么1.类型信息类名、父类、接口列表、访问修饰符字段信息字段名、类型、修饰符方法信息方法名、返回值、参数、修饰符、方法字节码常量池运行时常量池重点2.运行时常量池编译期生成的字面量字符串、数字、符号引用class 文件里的常量池加载后放到这里支持动态String.intern()、动态生成类、反射动态生成常量3.静态变量JDK1.7 之前静态变量在永久代JDK1.7 静态变量移到堆1.8 继续在堆4.静态常量5.方法表6.注解信息
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/28 2:00:22
没有投标专员怎么选AI标书工具?爱标书、钛投标、标小信、品茗智绘标书四款实测对比
2026/10/28 2:00:22
2026年帐篷出口加拿大SOR/2024-217安全法规指南
2026/10/28 2:00:22
曼德博分形图的简单绘制和保存
2026/10/28 7:46:20
基于51单片机的433遥控解码与学习型万能遥控器设计
2026/10/28 7:46:20
Transformer中自定义Attention机制实践指南
2026/10/28 7:46:20
GUI自动化测试核心技术解析与实践指南
2026/10/28 7:46:20
SSM框架实战:基于Spring+SpringMVC+MyBatis的二手车交易网站设计与部署
2026/10/28 7:46:20
Claude Code Workspace:AI工程队的运行时与MCP协同架构
2026/10/28 7:41:15
Java Swing 桌面宠物:透明窗口、拖拽与帧动画实战
2026/10/28 0:00:12
Stable Diffusion文生图全解析:从CLIP到UNet的扩散模型原理与实战
2026/10/28 0:00:12
从 Notebook 到 Python 项目:如何重构量化行情获取代码?
2026/10/28 0:00:12
2026版人形机器人标准:具身智能与模块化设计解析
2026/10/27 11:41:45
全国计算机二级C语言真题PDF高效刷题指南
2026/10/27 9:24:40
requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南
2026/10/27 12:03:45
递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现
2026/10/25 22:15:16
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/26 11:29:48
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/25 12:42:56
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)