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):** 对象头、对象体、对齐字节。
java 复制代码
// 堆溢出OOM (visual GC工具)
	public static void main(String[] args) {
			List<String> list =  new ArrayList<>();
//死循环
			for (int i = 0; ; i++)  {		
				System.out.println("execute... ..."+i);	
				list.add(new String(new byte[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.图示总结

相关推荐
m0_7485548117 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
lee_curry17 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
阿正呀18 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_9012005318 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
金銀銅鐵19 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
m0_4954964119 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume20 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
2301_8092047020 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
2301_815901971 天前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python