JVM详解
四大核心部分1. 类加载子系统 (Class Loader Subsystem)这是 JVM 的“入口”负责将静态的.class文件加载到内存中。核心职责负责加载、链接验证、准备、解析和初始化类文件。工作机制它通过双亲委派模型Parent Delegation Model来确保类加载的安全性和唯一性防止核心 API 被篡改。执行者- 类加载器是 JVM 类加载子系统Class Loading Subsystem 的核心执行者2. 运行时数据区 (Runtime Data Area 极其重要)线程私有区域程序计数器 记录当前线程执行的字节码行号是唯一没有规定内存溢出的区域。虚拟机栈描述 Java 方法执行的内存模型存储局部变量、操作数栈等栈帧。包含 局部变量表、 操作数栈用于临时存放中间数据具体执行还是需要cpu、 指向运行时常量池的引用、 方法返回地址返回下一条要执行的指令地址、 动态连接(编译之后有很多符号引用)栈侦详解设置栈大小通常不会手动的设置-Xss1m (默认) (重要)本地方法栈 为 Native 方法C/C 编写服务。线程共享区域堆 (Heap)存放对象实例和数组是垃圾回收GC的要区域。**[堆对象的结构](https://blog.csdn.net/a308495564s/article/details/119521487)** 对象头、对象体、对齐字节。// 堆溢出OOM (visual GC工具)publicstaticvoidmain(String[]args){ListStringlistnewArrayList();//死循环for(inti0;;i){System.out.println(execute... ...i);list.add(newString(newbyte[1024*1024*100]));}}堆分类堆heap, 年轻代老年代非堆non-heap , jvm除了heap以外的内存区域离堆off-heap , jvm外的内存区域物理内存本地计算机内存方法区 (Method Area / Metaspace)JDK 6 及以前静态变量和字符串常量池都在永久代堆内 受制于-xmx。JDK 7静态变量和字符串常量池被迁移到Java 堆(就是常说的堆区)。永久代只剩下类元数据。JDK 8 及以后类元数据被迁移到元空间堆外而静态变量和字符串常量池依然留在Java 堆。注意字符串常量池在堆区运行时常量池在元空间。3. 执行引擎 (Execution Engine)这是 JVM 的“大脑”负责执行字节码指令。解释器 (Interpreter)逐行读取并解释字节码启动速度快但执行效率相对较低。即时编译器 (JIT Compiler)将频繁执行的“热点代码”编译成本地机器码并缓存大幅提升运行效率。垃圾回收器 (Garbage Collector, GC)架构上它属于执行引擎的一部分负责自动回收堆内存中不再使用的对象。4. 本地方法接口 (Native Interface / JNI)这是 JVM 与外部世界交互的“桥梁”。作用融合不同的编程语言。当 Java 代码需要调用非 Java 语言如 C、C编写的本地库时通过 JNI 进行交互。本地方法库JNI 调用底层的本地方法库如操作系统层面的文件 IO、网络通信库。5.图示总结