JVM基本结构

目录

JVM的基本组成部分

[类加载器子系统(Class Loader Subsystem):](#类加载器子系统(Class Loader Subsystem):)

[执行引擎(Execution Engine):](#执行引擎(Execution Engine):)

[垃圾回收器(Garbage Collector):](#垃圾回收器(Garbage Collector):)

[本地库接口(Native Interface):](#本地库接口(Native Interface):)

JVM的内存区域

[程序计数器(Program Counter Register):](#程序计数器(Program Counter Register):)

[Java虚拟机栈(Java Virtual Machine Stacks,又称Java栈):](#Java虚拟机栈(Java Virtual Machine Stacks,又称Java栈):)

[本地方法栈(Native Method Stacks):](#本地方法栈(Native Method Stacks):)

[堆(Heap Area):](#堆(Heap Area):)

[方法区(Method Area):](#方法区(Method Area):)

其他相关内存区域

[运行时常量池(Runtime Constant Pool):](#运行时常量池(Runtime Constant Pool):)

[直接内存(Direct Memory):](#直接内存(Direct Memory):)


Java虚拟机(JVM,Java Virtual Machine)是Java程序执行的环境。JVM的结构复杂但有序,下面是对其结构的详细解析:

JVM的基本组成部分

JVM主要由以下几个部分构成:

类加载器子系统(Class Loader Subsystem)
  • 负责加载Java类文件到内存中。
  • 包括三个主要的类加载器:引导类加载器、扩展类加载器和应用程序类加载器。
  • 类加载器采用双亲委派模型,以确保Java类的安全性和一致性。
执行引擎(Execution Engine)
  • 负责执行字节码。
  • 包含解释器(Interpreter)和即时编译器(JIT Compiler)。解释器逐行解释执行字节码,而即时编译器则将热点代码编译为本地机器码,以提高执行效率。
垃圾回收器(Garbage Collector)
  • 负责自动管理内存,回收不再使用的对象。
本地库接口(Native Interface)
  • 允许Java程序调用本地代码,从而实现对系统资源的直接访问或使用现有的本地库。

JVM的内存区域

JVM在执行Java程序时,会在内存中分配不同的区域来存储数据。这些区域主要分为:

程序计数器(Program Counter Register)
  • 线程私有,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址。
  • 通过它实现代码的流程控制,如顺序执行、选择、循环、异常处理等。
  • 是唯一一个不会出现OutOfMemoryError的内存区域,其生命周期随着线程的创建而创建,随着线程的结束而结束。
Java虚拟机栈(Java Virtual Machine Stacks,又称Java栈)
  • 线程私有,由一个个栈帧(Stack Frame)组成。
  • 每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法出口信息等。
  • 每一次函数调用都会有一个对应的栈帧被压入虚拟机栈,每一个函数调用结束后,都会有一个栈帧被弹出。
  • 局部变量表用于存放方法参数和方法内的局部变量。
  • 可能出现StackOverFlowError和OutOfMemoryError异常。
本地方法栈(Native Method Stacks)
  • 线程私有,用于支持Java调用本地方法(Native Method)。
  • 与虚拟机栈的作用相似,但虚拟机栈为Java方法服务,而本地方法栈为本地方法服务。
  • 也可能出现StackOverFlowError和OutOfMemoryError异常。
堆(Heap Area)
  • 线程共享,用于存放对象实例和数组,是Java内存管理的主要区域。
  • 可以细分为新生代(包括Eden空间、From Survivor、To Survivor空间)和老年代。
  • 通过-Xms参数设定程序启动时占用内存大小,通过-Xmx参数设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
方法区(Method Area)
  • 又称为永久代(Permanent Generation,在JDK 1.8之前使用),但在JDK 1.8中已被元空间(MetaSpace)取代。
  • 线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 在JDK 1.8之前,方法区在JVM内存中,受JVM内存大小参数限制。而在JDK 1.8及之后,元空间直接在物理(本地)内存中实现,不再受JVM内存大小参数限制,但物理内存不足时仍可能报OOM。

其他相关内存区域

运行时常量池(Runtime Constant Pool)
  • 是方法区的一部分。
  • 在类加载之后,会将编译器生成的各种字面量和符号引用放到运行时常量池。
  • 在运行期间动态生成的常量,如String类的intern()方法生成的常量,也会被放入运行时常量池。
直接内存(Direct Memory)
  • 不是虚拟机运行时数据区的一部分,但在Java堆外,直接向系统申请的内存区域。
  • 常见于NIO操作时,用于数据缓冲区(比如ByteBuffer使用的就是直接内存)。
  • 分配、回收成本较高,但读写性能高。
  • 不受JVM内存回收管理,但系统内存是有限的,物理内存不足时会报OOM。
相关推荐
碎梦归途1 小时前
23种设计模式-结构型模式之享元模式(Java版本)
java·开发语言·jvm·设计模式·享元模式
左灯右行的爱情2 小时前
JVM-卡表
java·jvm·算法
程序猿chen2 小时前
JVM考古现场(二十五):逆熵者·时间晶体的永恒之战(进阶篇)
java·jvm·git·后端·程序人生·java-ee·改行学it
web安全工具库4 小时前
Python内存管理之隔代回收机制详解
java·jvm·算法
bing_1584 小时前
如何使用命令行工具监控 JVM 的运行状态?
jvm·监控jvm运行状态
Elastic 中国社区官方博客6 小时前
Elasticsearch 堆内存使用情况和 JVM 垃圾回收
大数据·jvm·数据库·elasticsearch·搜索引擎·全文检索
芦屋花绘10 小时前
Java的JUC详细全解
java·开发语言·jvm·spring boot·kafka
长安思14 小时前
在C#串口通信中,一发一收的场景,如何处理不同功能码的帧数据比较合理,代码结构好
java·jvm·算法
jieyucx15 小时前
C++中的引用:深入理解与实用示例
java·jvm·c++
碎梦归途1 天前
23种设计模式-创建型模式之原型模式(Java版本)
java·开发语言·jvm·设计模式·原型模式