Java虚拟机:内存模型与核心机制

发布时间:2026/9/9 0:29:07

Java虚拟机:内存模型与核心机制 前言作为一名Java开发者我们每天都在编写、编译、运行Java代码但你是否真正了解过代码背后的“容器”——Java虚拟机JVM它如何管理内存对象在内存中是如何分布的为什么有时候会抛出StackOverflowError或OutOfMemoryError本文将带你从宏观到微观逐层拆解JVM的内存结构、数据流转和核心工作机制帮助你建立完整的JVM知识体系。一、JVM整体架构概览JVM可以看作一个完整的计算机系统模型其核心组件包括组件作用类加载子系统负责加载Class文件将类的元数据存入方法区运行时数据区包括堆、方法区、栈、本地方法栈、PC寄存器执行引擎解释/编译执行字节码垃圾回收系统自动回收不再使用的内存二、类加载子系统——JVM的“入口”类加载子系统负责从文件系统或网络中加载Class信息加载后的类信息存放于方法区。除了类的结构信息字段、方法、接口等方法区中还存放着运行时常量池包括字符串字面量如hello数字常量如100符号引用和直接引用类比理解类加载就像图书馆的采编部门把新书Class文件登记上架方法区供读者程序借阅使用。三、Java堆——最大的内存区域3.1 堆的核心特性线程共享所有线程都可以访问堆中的对象存储对象实例几乎所有的Java对象都在堆中分配内存垃圾回收的主要战场GC最频繁操作的区域3.2 堆的分代结构为了提升垃圾回收效率HotSpot虚拟机将堆划分为新生代和老年代各区域作用区域说明Eden绝大多数新对象首先分配于此Survivor (S0/S1)经历一次GC后存活的对象移入两个区大小相等角色可互换From/To老年代年龄达到阈值默认15的幸存者进入老年代复制算法新生代GC时将Eden和一个Survivor中存活的对象复制到另一个Survivor清空前两者两个Survivor角色互换。四、Java栈——线程执行的“舞台”4.1 栈的基本特性线程私有每个线程都有自己的Java栈随线程创建而创建存储栈帧每次方法调用都会创建一个栈帧压入栈顶方法返回时弹出正常return或抛出异常都会导致栈帧出栈4.2 栈帧的内部结构每个栈帧包含三大部分┌─────────────────────────────┐ │ 局部变量表 │ ← 存储方法参数和局部变量 ├─────────────────────────────┤ │ 操作数栈 │ ← 存放中间运算结果 ├─────────────────────────────┤ │ 帧数据区 │ ← 常量池引用、异常表等 └─────────────────────────────┘4.3 方法调用与栈的关系来看一个嵌套调用的示例void function1() { function2(); } void function2() { function3(); } void function3() { function4(); } void function4() { /* 执行操作 */ }调用过程栈的变化调用function1() → 栈帧1入栈 调用function2() → 栈帧2入栈 调用function3() → 栈帧3入栈 调用function4() → 栈帧4入栈 (栈顶当前帧) 返回 → 栈帧4出栈 ...当前帧位于栈顶的帧代表当前正在执行的方法。五、栈溢出StackOverflowError深度剖析5.1 为什么会出现栈溢出每次方法调用都会创建栈帧占用栈空间。当调用深度超过栈容量时就会抛出StackOverflowError。5.2 实战演示以下递归方法没有终止条件会持续压栈public class TestStackDeep { private static int count 0; public static void recursion(long a, long b, long c) { // 定义大量局部变量增加栈帧大小 long e1, f2, g3, h4, i5, k6, q7, x8, y9, z10; count; recursion(a, b, c); // 无终止条件的递归 } public static void main(String[] args) { try { recursion(1, 2, 3); } catch (Throwable e) { System.out.println(deep of calling count); e.printStackTrace(); } } }5.3 参数 -Xss 的影响-Xss参数用于设置每个线程的栈大小默认通常为1MB。栈大小配置最大调用深度示例-Xss128k约 1097 次-Xss256k约 2730 次结论栈空间越大可支持的调用深度越深但可创建的线程总数会减少。需要根据实际场景权衡。六、方法区——类的“档案馆”方法区存放着类的元数据信息类的全限定名、访问修饰符字段信息、方法信息运行时常量池静态变量即时编译器编译后的代码缓存⚠️注意JDK 8 之后方法区被元空间Metaspace取代使用本地内存而非堆内存默认自动扩容。七、堆、栈、方法区的联动关系通过一个实例来理解三者如何协同工作public class SimpleHeap { private int id; public SimpleHeap(int id) { this.id id; } public void show() { System.out.println(My ID is id); } public static void main(String[] args) { SimpleHeap s1 new SimpleHeap(1); SimpleHeap s2 new SimpleHeap(2); s1.show(); s2.show(); } }内存布局如下关键点栈存储局部变量引用类型变量保存的是地址值堆存储对象实例方法区存储类的结构信息八、其他重要组件简介8.1 直接内存Direct Memory位于Java堆外通过NIO的ByteBuffer.allocateDirect()分配访问速度通常优于堆内存适合读写频繁的场景不受-Xmx限制但受系统总内存限制8.2 本地方法栈与Java栈类似但服务于本地方法Native Method通常用C/C编写用于调用操作系统底层功能8.3 PC寄存器Program Counter每个线程私有用于记录当前执行字节码的行号是JVM中唯一没有规定OutOfMemoryError的区域8.4 执行引擎Execution Engine负责解释/编译执行字节码采用即时编译JIT技术将热点代码编译为机器码以提升性能九、JVM参数设置实战9.1 基本语法java [-options] class [args...]部分说明-optionsJVM启动参数如-Xms32m -Xmx256mclass包含main()方法的类args传递给main()方法的参数9.2 示例代码public class SimpleArgs { public static void main(String[] args) { for (int i 0; i args.length; i) { System.out.println(参数 (i 1) : args[i]); } System.out.println(最大堆内存: Runtime.getRuntime().maxMemory() / 1024 / 1024 M); } }执行命令java -Xmx32m SimpleArgs a输出结果参数1:a 最大堆内存: 32M✅-Xmx32m传给JVMa传给main方法作为程序参数。十、总结与要点回顾组件线程共享存储内容主要异常堆✅ 是对象实例OutOfMemoryError方法区✅ 是类元数据、常量池OutOfMemoryErrorJava栈❌ 否栈帧局部变量、操作数栈StackOverflowError本地方法栈❌ 否本地方法栈帧StackOverflowErrorPC寄存器❌ 否字节码行号无直接内存✅ 是NIO缓冲区OutOfMemoryError
延伸阅读

更多相关文章

2026/9/9 6:08:25

深入解析TI TMS320F2837xS DSP的DCSM安全机制与ROM预取配置

1. 项目概述与核心价值在工业控制、汽车电子这些对可靠性和安全性要求极高的领域,我们手里的那颗微控制器(MCU)早已不是简单的计算单元,它更像是一个需要严密守护的“数字堡垒”。最近在折腾TI的TMS320F2837xS系列DSP时&#xff0…

2026/9/6 0:01:51

Claude Code与DeepSeek API集成开发指南

1. Claude Code与DeepSeek集成方案概述 作为一名长期使用AI编程助手的开发者,我发现Claude Code与DeepSeek的集成确实能够显著提升编程效率。Claude Code作为终端内的AI编程助手,通过与DeepSeek API的结合,可以发挥出更强大的代码生成和理解能…

2026/9/9 6:06:24

BUUCTF Misc第16-20题实战:隐写分析、二维码修复与AES解密全解析

刷BUUCTF Misc的题,很多人都是从第1题开始一路往后啃的,我最近正好啃到题单里的第16到20题。这一批题画风很杂:有签到题里藏着看不见的字符,有二维码图片扫不出来,有从一百张图里挑一个有问题的,还有一个名…

2026/9/9 6:06:24

AI率检测原理与降AI工具实测:从困惑度到双平台差异

这个月我已经第三次看到有人在同一句话里崩溃:“我自己一个字一个字敲出来的文章,AI率怎么还73%?”说实话,我最初对“降AI率工具”这个词是有一点抵触的,总觉得它带着某种不太好上台面的目的。直到自己一篇完全没用AI生…

2026/9/9 6:06:24

数据安全与API安全双赛道发力,解读2026年网安全景图入选价值

1. 全景图入选背后:一份行业“地图”的价值在哪 先说个我自己的体会。做网络与信息安全这行,最怕的不是技术难题,而是看不清自己在行业里的坐标。技术方向那么多,数据安全、应用安全、零信任、攻防演练,每一条赛道都有…

2026/9/9 6:06:24

DINOv2自监督视觉预训练:从特征提取到微调部署的完整指南

简介:面向深度学习研究与开发者的Dinov2自监督视觉模型完整代码与预训练权重包,基于Transformer架构,专注解决无标注数据下的视觉表示学习及下游任务微调问题。资源共90个文件,包含58个Python源码、10个YAML配置文件、4个PTH预训练…

2026/9/9 6:06:24

逆向识别SHA哈希算法:从静态特征到版本鉴别技巧

前阵子分析一个 Android so 的校验逻辑,函数没符号,字符串表也被处理过,能追的线索有限。调用链走到后半段时,我发现目标代码在按固定块大小处理输入,桶里反复出现异或、循环右移和加法,最后往缓冲区里写了…

2026/9/9 6:01:24

欧姆龙CJ2M PLC标准化程序模板:伺服与气缸控制模块化设计

做非标自动化这几年,我手里积攒最多的资料不是设备图纸,而是各种设备的PLC程序。每次接到新设备调试任务,最怕的就是打开一台控制伺服电机和气缸的设备,程序居然还是一个大梯形图从头铺到尾,改一个动作要在几十个程序段…

2026/9/8 7:15:10

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/8 7:15:10

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/7 22:45:59

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码