JVM虚拟机结构

本文详细介绍了JVM虚拟机的三个主要部分:类加载器负责加载字节码,内存结构包括线程共享内存(方法区和堆内存)及线程私有内存(程序计数器、JVM栈和本地方法栈),执行引擎由解释器、即时编译器和垃圾回收器组成。

虚拟机结构图

在这里插入图片描述

从图中看出:
JVM虚拟机主要有三大部分组成:
1. 类加载器
2. JVM运行时内存
3. 执行引擎

一、类加载器

类加载器主要用来加载字节码文件(.class)到内存中

二、内存结构

如图:可将内存分为两大部分,一、线程共享内存区域;二、线程私有内存区域

2.1 线程共享内存

共享内存有两部分:方法区、堆内存

  • 方法区:主要用来存储类加载器加载的类的原始数据,如类名、类的继承信息、类上的注解信息等等;
  • 堆内存:凡是创建的新的对象都会放到堆内存中,如new Student()
2.2 内存私有内存

私有内存主要有三块:程序计数器、JVM虚拟机栈、本地方法栈

  • 程序计数器:主要是记录当前线程被CPU执行程序的行数,方便CPU下次切换过来继续执行;
  • JVM虚拟机栈:用来存储局部变量、对象引用信息、方法参数信息等;
  • 本地方法栈:用来存储本地方法的内容,本地方法指JVM需要依托操作系统才能执行的方法,需要通过JVM调用操作系统来完成的一些事件。

三、执行引擎

执行引擎主要分为三部分:解释器、即时解释器(JIT)、垃圾回收器(GC)

  • 解释器:因为JVM目前执行的是.class字节码文件,但是CPU无法识别字节码,CPU只能识别机器码,所以.class需要通过解释器来将字节码文件解释为机器码;
  • 即时解释器:如果所有的.class在运行的时候都需要解释,那么效率将会不高,所有JVM提出热点代码的概念,即时解释器可以发现热点代码(经常执行的代码片段),将其机器码缓存起来,来保证热点代码的即时解释;
  • 垃圾回收器:用来回收对象,释放内存。
### JVM虚拟机结构详解 JVMJava Virtual Machine)是运行Java程序的核心组件,其内部结构由多个部分组成,每个部分承担特定的功能。以下是JVM的详细结构和组成: #### 1. 运行时数据区 运行时数据区是JVM在运行Java程序时使用的内存区域,分为以下几个部分[^4]: - **方法区(Method Area)** 方法区用于存储类信息、常量、静态变量等数据。它是所有线程共享的内存区域,在JVM启动时创建。从Java 8开始,方法区被元空间(Metaspace)取代,元空间使用本地内存而非堆内存[^2]。 - **堆(Heap)** 堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆是所有线程共享的,并且可以划分为年轻代(Young Generation)和老年代(Old Generation)。为了提高垃圾回收效率,堆中还可能包含TLAB(Thread Local Allocation Buffer),用于分配小对象[^2]。 - **栈(Stack)** 每个线程都有一个私有的栈,用于存储局部变量和操作数栈。每当调用一个方法时,都会在栈中创建一个栈帧(Frame),用于存储局部变量表、操作数栈、动态链接信息、方法出口等[^3]。 - **程序计数器(Program Counter Register)** 程序计数器是一个较小的内存区域,用于存储当前线程执行的字节码的行号指示器。如果线程正在执行的是一个Java方法,则记录的是虚拟机字节码指令的地址;如果是Native方法,则值为空(undefined)。程序计数器是线程私有的,生命周期与线程相同[^3]。 - **本地方法栈(Native Method Stack)** 本地方法栈为JVM使用到的本地方法服务。它的功能与Java栈类似,但主要服务于本地方法(如C语言编写的代码)[^4]。 #### 2. 类加载器(ClassLoader) 类加载器负责将字节码文件(`.class`文件)加载到JVM的运行时数据区中。类加载过程包括加载、验证、准备、解析和初始化五个阶段[^4]。 #### 3. 执行引擎 执行引擎负责读取方法区中的字节码并执行。它可以通过解释器逐条解释字节码,也可以通过即时编译器(JIT Compiler)将字节码编译为本地机器码后执行。执行引擎的主要组成部分包括: - 解释器:逐条解释字节码。 - JIT编译器:将频繁执行的字节码编译为本地机器码以提高性能。 - 垃圾回收器(Garbage Collector):负责回收堆中不再使用的对象,释放内存资源。 #### 4. 垃圾回收机制(Garbage Collection, GC) 垃圾回收是JVM的重要特性之一,用于自动管理内存资源。常见的垃圾回收算法包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)等。JVM提供了多种垃圾回收器,例如Serial GC、Parallel GC、CMS(Concurrent Mark-Sweep)GC和G1 GC等[^1]。 --- ### 示例代码 以下是一个简单的Java程序及其对应的JVM运行时数据区划分示例: ```java public class Main { public static void main(String[] args) { int a = 10; // 局部变量a存储在栈中 String str = "Hello World"; // 字符串常量存储在方法区,引用存储在栈中 Person person = new Person(); // 对象person存储在堆中,引用存储在栈中 } } class Person { String name; int age; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值