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 程序在不同平台上都能流畅地执行。

相关推荐
Ajiang282473530433 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空38 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端