JVM(Java虚拟机)的核心组成

1. 类加载器(Class Loader)
  • 功能 :负责将.class文件加载到内存,并转换为JVM可识别的数据结构。

  • 分类

    • 启动类加载器(Bootstrap Class Loader) :加载JAVA_HOME/lib下的核心类库(如rt.jar)。

    • 扩展类加载器(Extension Class Loader) :加载JAVA_HOME/lib/ext下的扩展类。

    • 应用程序类加载器(Application Class Loader):加载用户类路径(ClassPath)的类。

    • 自定义类加载器 :用户可继承ClassLoader实现自定义加载逻辑。

  • 双亲委派模型:优先由父类加载器尝试加载类,避免重复加载并确保安全。


2. 运行时数据区(Runtime Data Areas)

JVM内存管理的核心区域,分为线程私有和共享区域:

2.1 线程私有区域
  • 程序计数器(Program Counter Register)

    • 记录当前线程执行的字节码指令地址。

    • 唯一不会发生内存溢出的区域。

  • 虚拟机栈(Java Virtual Machine Stack)

    • 存储方法调用的栈帧(Frame),每个栈帧包含:

      • 局部变量表:方法参数和局部变量。

      • 操作数栈:执行字节码指令的工作区。

      • 动态链接:指向运行时常量池的方法引用。

      • 返回地址:方法执行后的返回位置。

    • 可能抛出StackOverflowError(栈深度过大)和OutOfMemoryError(扩展失败)。

  • 本地方法栈(Native Method Stack)

    • 为Native方法(如C/C++实现)服务,结构与虚拟机栈类似。
2.2 线程共享区域
  • 堆(Heap)

    • 存储所有对象实例和数组。

    • 分为新生代(Young Gen)和老年代(Old Gen):

      • 新生代:Eden区、Survivor区(From/To),使用复制算法回收。

      • 老年代:存放长期存活对象,使用标记-整理或标记-清除算法。

    • 可能抛出OutOfMemoryError

  • 方法区(Method Area)

    • 存储类元数据(如类名、字段、方法)、常量池、静态变量等。

    • 实现变化

      • JDK 8前:永久代(PermGen),受JVM内存限制。

      • JDK 8+:元空间(Metaspace),使用本地内存(Native Memory)。

  • 运行时常量池(Runtime Constant Pool)

    • 方法区的一部分,存储类文件中的常量(如字符串字面量、符号引用)。

3. 执行引擎(Execution Engine)

负责将字节码翻译为机器码并执行:

  • 解释器(Interpreter)

    • 逐行解释执行字节码,启动速度快但执行效率低。
  • 即时编译器(JIT Compiler)

    • 将热点代码(频繁执行的代码)编译为本地机器码,提升执行效率。

    • 主流JVM(如HotSpot)采用分层编译(C1、C2编译器)。

  • 垃圾回收器(Garbage Collector)

    • 自动回收堆中不再使用的对象内存,常见算法:

      • 标记-清除(Mark-Sweep):简单但产生内存碎片。

      • 复制(Copying):用于新生代,无碎片但内存利用率低。

      • 标记-整理(Mark-Compact):用于老年代,避免碎片。


4. 本地方法接口(JNI, Java Native Interface)
  • 功能:允许Java代码调用本地方法(Native Method,如C/C++库)。

  • 示例System.currentTimeMillis()底层通过JNI调用操作系统API。


5. 本地方法库(Native Libraries)
  • 组成 :包含JVM所需的本地库(如libjvm.solibjava.so)。

  • 作用:支持JVM与操作系统交互(如线程调度、文件操作)。


JVM内存结构示意图

总结

  • 核心组件:类加载器、运行时数据区、执行引擎、本地接口及库。

  • 内存管理:堆和方法区是内存管理的重点,垃圾回收机制保障内存高效利用。

  • 性能优化:通过JIT编译、分代回收、元空间替代永久代等手段提升效率。

  • 线程安全:私有区域隔离线程状态,共享区域需同步机制(如锁、CAS)。

理解JVM组成及工作原理,是优化Java程序性能、解决内存泄漏和并发问题的关键基础。

相关推荐
码农飞哥9 分钟前
互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
java·数据库·spring boot·缓存·微服务·消息队列·面试技巧
liudongyang12311 分钟前
jenkins 启动报错
java·运维·jenkins
曹牧18 分钟前
JSON 实体属性映射的最佳实践
java
qq_5432485229 分钟前
Tomcat服务部署
java·tomcat
小王努力学编程44 分钟前
高并发内存池(三):TLS无锁访问以及Central Cache结构设计
jvm·数据结构·c++·学习
Auc241 小时前
OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
java·spring cloud·log4j·mybatis·代理模式·工厂模式
熊大如如1 小时前
Java NIO 文件处理接口
java·linux·nio
有梦想的攻城狮1 小时前
spring中的@Lazy注解详解
java·后端·spring
星星点点洲1 小时前
JVM对象分配与程序崩溃排查
jvm
辛普森Mmmm1 小时前
JVM详解
jvm