当前位置: 首页 > article >正文

java重要知识点 JVM基本结构

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

JVM 基本结构概览

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

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

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

1. 类加载子系统

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

  • 加载:将 .class 文件加载到内存。
  • 验证:确保类的字节码文件不包含非法的代码。
  • 准备:为类的静态变量分配内存。
  • 解析:将符号引用(如类名)替换为直接引用。
  • 初始化:执行静态初始化代码。
示例代码:
 

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 在执行效率和启动速度之间取得平衡。
示例代码:
 

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


http://www.kler.cn/a/380327.html

相关文章:

  • Docker与虚拟机(VM)的不同
  • el-upload,上传文件,后端提示信息,前端需要再次重新上传(不用重新选择文件)
  • 基于 Canal + Elasticsearch 的业务操作日志解决方案
  • 【Centos】在 CentOS 9 上使用 Apache 搭建 PHP 8 教程
  • 算法学习027 c++蛇形三角形填充 二维数组常规应用 中小学算法思维学习 比赛算法题解 信奥算法解析
  • 批量删除redis数据【亲测可用】
  • ACM模式输入输出处理(JS版)
  • ONLYOFFICE 文档8.2更新评测:PDF 协作编辑、性能优化及更多新功能体验
  • ChatGPT中的RAG;大模型微调;通过正确的提问和回答数据进行问答系统的微调;
  • YOLOv10的网络架构解析
  • 全面解析:容器化技术及其应用
  • Spring框架的JDBC模板技术
  • Python绘制爱心
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29
  • 前端面试题22 | 什么是跨域问题?怎么解决?
  • java 对人名和电话 脱敏-replaceAll
  • HTB:Mirai[WriteUP]
  • 第七部分:1. STM32之ADC实验--单通道实验
  • 新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用
  • Ps:天空替换
  • 2024-11-4 学习人工智能的Day21 openCV(3)
  • Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
  • sql专题 之 常用命令
  • React05 样式控制 classnames工具优化类名控制
  • 【算法】Prim最小生成树算法
  • 【k8s】-运维技巧-1