java重要知识点 JVM基本结构

Java 虚拟机(JVM)是 Java 程序运行的基础环境,它将 Java 字节码转换为机器码,使得同一程序能够在不同平台上运行。JVM 的内部结构包括多个核心组件,协同工作以管理内存、执行代码和垃圾回收。

JVM 基本结构概览

JVM 的主要组成部分包括以下几个核心区域:

  1. 类加载子系统:负责加载、链接和初始化 Java 类。
  2. 运行时数据区:JVM 运行时的数据存储区,包含方法区、堆、栈、本地方法栈和程序计数器。
  3. 执行引擎:将字节码转换为机器码,并优化执行效率。
  4. 垃圾回收(GC):自动回收无用对象,管理内存。

接下来,我们详细介绍每个部分的作用及其工作机制。

1. 类加载子系统

类加载是 JVM 加载类文件的过程,包括加载、验证、准备、解析和初始化五个阶段。这个系统负责将字节码文件转换为 JVM 可以执行的格式。

  • 加载:将 .class 文件加载到内存。
  • 验证:确保类的字节码文件不包含非法的代码。
  • 准备:为类的静态变量分配内存。
  • 解析:将符号引用(如类名)替换为直接引用。
  • 初始化:执行静态初始化代码。
示例代码:
复制代码
java 复制代码
public class ClassLoaderExample { static int x = 10; // 在准备阶段分配内存,在初始化阶段赋值 static { x = 20; // 初始化阶段,赋值为 20 } }

2. 运行时数据区

运行时数据区是 JVM 运行时分配内存的地方,包括方法区、堆、栈、本地方法栈和程序计数器。

a. 方法区

方法区存储类的元数据(如字段、方法、静态变量)。方法区可以理解为存储类模板的地方,JVM 在这里查找类的方法和字段信息。

b. 堆

堆是存储对象实例的区域,也是 Java 内存管理的主要区域。所有的对象都在堆中分配内存。堆的内存管理通过垃圾回收机制自动管理,分为新生代和老年代。

c. 栈

栈用于存储方法调用的局部变量、操作数等。每个线程有自己的栈,栈中的每个方法调用对应一个栈帧。栈帧包括局部变量表和操作数栈,线程结束时,栈空间会自动释放。

d. 本地方法栈

本地方法栈用于存储本地方法调用的数据。它是支持 JNI(Java Native Interface)的部分,使得 Java 能调用 C/C++ 等语言的本地代码。

e. 程序计数器

程序计数器用于记录当前线程执行到的字节码位置。它是 JVM 中唯一可以保证线程独立的区域,保证了多线程执行时的安全性。

3. 执行引擎

执行引擎负责解释或编译字节码,并将其转换为机器码,具体包括以下部分:

  • 解释器:逐行解释执行字节码,启动快但运行效率相对较低。
  • 即时编译器(JIT):JIT 编译器会将高频执行的字节码编译为本地机器码,以提高效率。通过这种方式,JVM 在执行效率和启动速度之间取得平衡。
示例代码:
复制代码
java 复制代码
public class JITExample { public void run() { for (int i = 0; i < 1000000; i++) { // JIT 编译器会将频繁执行的代码编译为机器码,提高执行效率 System.out.println("JIT Example"); } } }

4. 垃圾回收器(GC)

垃圾回收器是 JVM 中的内存管理模块。它自动回收不再使用的对象,避免手动管理内存。垃圾回收通常分为两大代,即新生代和老年代,新生代分为 Eden 区和两个 Survivor 区。GC 的过程如下:

  1. 新生代 GC(Minor GC):在新生代区域中频繁触发,用于回收短期存活的对象。
  2. 老年代 GC(Major GC):在老年代区域中触发,处理长生命周期的对象,通常频率低,但消耗的资源较多。

通俗比喻

可以将 JVM 比作一个图书馆,里面有不同的区域:

  • 类加载子系统 就像图书馆的入口处,它将书籍(Java 类文件)进行分类、编排上架,确保每本书的内容合法(验证阶段)。
  • 方法区 是一本书的目录,记录了书的结构(元数据、方法)。
  • 就是图书馆的书架,存放所有书籍内容。这里的书随时可以取出。
  • 是一张阅读桌,记录读者阅读时的临时信息,比如笔记、标记的位置(局部变量)。
  • 执行引擎 就是图书馆里的阅读人员,将书本内容快速解读出来(解释器),高频阅读的书甚至会直接记在脑子里(JIT编译)。
  • 垃圾回收器 则像图书馆的管理人员,定期将无人翻阅的旧书清理掉,以便给新书腾出空间。

总结

JVM 是 Java 程序运行的核心结构,通过类加载子系统加载类,运行时数据区管理内存,执行引擎执行字节码,垃圾回收器回收无用对象。JVM 提供了跨平台的执行环境,使得 Java 程序可以"一次编译,到处运行"。

这个 JVM 结构不仅确保了代码的安全性和稳定性,也帮助开发者有效管理内存,使得 Java 程序在不同平台上都能流畅地执行。

相关推荐
Java技术小馆6 分钟前
SpringBoot中暗藏的设计模式
java·面试·架构
xiguolangzi6 分钟前
《springBoot3 中使用redis》
java
꧁坚持很酷꧂9 分钟前
配置Ubuntu18.04中的Qt Creator为中文(图文详解)
开发语言·qt·ubuntu
李菠菜13 分钟前
非SpringBoot环境下Jedis集群操作Redis实战指南
java·redis
不当菜虚困26 分钟前
JAVA设计模式——(四)门面模式
java·开发语言·设计模式
ruyingcai66666626 分钟前
用python进行OCR识别
开发语言·python·ocr
m0Java门徒34 分钟前
面向对象编程核心:封装、继承、多态与 static 关键字深度解析
java·运维·开发语言·intellij-idea·idea
liuweidong080236 分钟前
【Pandas】pandas DataFrame radd
开发语言·python·pandas
无心水1 小时前
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
java·笔记·面试·vector·arraylist·linkedlist
农民也会写代码1 小时前
dedecms织梦arclist标签noflag属性过滤多个参数
开发语言·数据库·sql·php·dedecms