JVM 内存模型
2025-08-05 14:53:32 14 举报
一个Java文件从编译到运行的整个流程
作者其他创作
大纲/内容
c()调用结束
本地方法栈帧
CPU 资源
BoootstarpClass Loader
JVM 中,方法栈(Method Stack)的压栈操作发生在方法调用时,而不是类加载时。当线程调用一个方法时,JVM 会为该方法创建一个 栈帧(Stack Frame) 并压入当前线程的 Java 虚拟机栈(JVM Stack)。方法执行完毕后,对应的栈帧会被弹出(出栈),控制权返回给调用方。
动态链接到下一个栈
Java方法栈
链接
S1
方法栈帧
Surivor 区部分活跃对象复制到Old区
栈帧
栈帧 b
动态链接- 指向运行时常量池的返回地址
ExtensionClass Loader
运行时数据区
是
否
结束
解析
运行时常量池(Runtime Constant Pool)
程序计数器
Minor GC
本地方法栈
Survivor区
线程B
堆
动态链接
Young 区
栈帧 a
类加载器
Eden 区部分活跃对象复制到Surivor区
1
元空间
b()调用结束
线程A
Old区是否有足够的空间
方法区
类信息:- 版本号-字段、方法、接口、父类等描述信息- 静态常量池
附加信息
垃圾回收
Survivor区是否有足够的空间
直接内存
静态变量
开始
类加载
old 区
字符串常量池
本地方法栈(Native Stack)
JIT编译器
S0
Full GC
线程私有
JVM
Java 虚拟机栈
- 符号引用解析- 方法/字段引用
2
返回地址
栈帧信息
准备
动态链接解析 native
Eden 是否有足够的空间
局部变量表
虚拟机栈(Stack) T1
Eden 区是否有足够的空间
b()方法调用c()
程序计数器(Program Counter)
创建的新对象申请内存空间
堆内存
DriverManager(由 Bootstrap 加载)调用 Class.forName(\"com.mysql.cj.jdbc.Driver\")。Bootstrap 尝试加载,但找不到 MySQL 驱动(不在 JAVA_HOME/lib 下)。Extension 尝试加载,仍然找不到(不在 JAVA_HOME/lib/ext 下)。AppClassLoader 可以加载(因为 MySQL 驱动在 ClassPath 下)但问题来了!👉 Bootstrap 加载的代码(DriverManager)无法直接触发 AppClassLoader 去加载驱动类!因为 Bootstrap 不知道 AppClassLoader 的存在(类加载器层级是单向的,父不知道子)。Bootstrap 是由 JVM 原生代码(C++)实现的,它不是一个 Java 类(getClassLoader() 返回 null),所以它无法持有或访问 AppClassLoader。如果允许 Bootstrap 直接调用 AppClassLoader,会破坏安全模型:黑客可以在 ClassPath 下放一个伪造的 java.lang.SecurityManager,Bootstrap 如果向下查找,就会加载恶意类,导致安全漏洞。
字节码执行引擎
JVM 进行 FullGC
JVM 回收不活跃的对象
线程T1调用 a() 方法
运行时常量池
本地内存
本地栈帧(C/C++代码)
CPU 线程调度算法分配
Java 虚拟机栈(JVM Stack)
实例化
特殊情况:逃逸分析与栈上分配逃逸分析(Escape Analysis):如果 JVM 发现对象不会逃出方法作用域(即不会被其他方法或线程引用),可能会优化为 栈上分配(Stack Allocation),直接在栈上创建对象,避免堆内存分配。但大多数情况下,尤其是标准 JVM 实现(如 HotSpot),对象仍优先分配在堆中。
解释器
OutOfMemoryError
- 当前线程指向的字节码指令地址- Native 方法执行时为 undefined
JNI
a()方法调用b()
private static void calc(){ Object object = new Object(); System.out.println(object); }new Object() 会在 堆内存 中分配一块空间,存储这个 Object 实例栈帧中的局部变量 object 指向对中的 Object 实例calc() 方法执行完毕时,栈帧被销毁,局部变量 object 也随之消失堆中的 Object 实例如果没有其他引用指向它,会在下一次 GC 时被回收
新对象的空间申请成功
Eden区
ApplicaitonClass Loader
3
验证
操作数栈
JVM 下一步要执行的指令
栈帧 c
堆:存储对象实例,垃圾回收(GC)的主要工作区域
本地方法库
0 条评论
下一页