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

相关推荐
装不满的克莱因瓶3 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗10 分钟前
常用类晨考day15
java
biomooc11 分钟前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人13 分钟前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar15 分钟前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound20 分钟前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
用余生去守护1 小时前
python报错系列(16)--pyinstaller ????????
开发语言·python
yuanbenshidiaos1 小时前
c++---------数据类型
java·jvm·c++
数据小爬虫@1 小时前
利用Python爬虫快速获取商品历史价格信息
开发语言·爬虫·python
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎