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。
相关推荐
martian6651 小时前
【Java高级篇】——第16篇:高性能Java应用优化与调优
java·开发语言·jvm
李长渊哦8 小时前
Java 虚拟机(JVM)方法区详解
java·开发语言·jvm
二十七剑14 小时前
jvm中各个参数的理解
java·jvm
七禾页话17 小时前
垃圾回收知识点
java·开发语言·jvm
小梁不秃捏1 天前
深入浅出Java虚拟机(JVM)核心原理
java·开发语言·jvm
xiaolingting2 天前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
神仙别闹2 天前
基于Python+Sqlite实现的选课系统
jvm·python·sqlite
上分小子2.02 天前
jvm-Java虚拟机
java·开发语言·jvm
5xidixi2 天前
JAVA EE初阶 JVM
java·jvm·java-ee
北城以南没有天2 天前
排查JVM的一些命令
jvm