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

JVM之JVM的组成

Java 虚拟机(JVM)是 Java 程序的运行核心,它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。

类加载系统(Class Loading System)

类加载系统负责在程序运行时动态地将 Java 类加载到 JVM 中。它主要包含以下三个类加载器以及类加载的过程:

  • 启动类加载器(Bootstrap Class Loader):由原生代码(如 C++)实现,负责加载 Java 的核心类库,如java.lang包下的类,它是所有类加载器的根。
  • 扩展类加载器(Extension Class Loader):负责加载 Java 的扩展类库,通常是jre/lib/ext目录下的类。
  • 应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载用户类路径(classpath)上的类,是我们日常开发中最常用的类加载器。

运行时数据区(Runtime Data Area)

运行时数据区是 JVM 在运行时所管理的内存区域,可分为以下几个部分:

  • 方法区(Method Area)
    • 所有线程共享的内存区域,用于存储已被 JVM 加载的类信息、常量、静态变量等数据。在 JDK 1.8 之前,方法区也被称为永久代(Permanent Generation),而在 JDK 1.8 及以后,方法区由元空间(Metaspace)替代,元空间使用本地内存,不再受 JVM 堆内存的限制。
  • 堆(Heap)
    • 所有线程共享的内存区域,是 JVM 中最大的一块内存区域,用于存储对象实例和数组。堆内存会被垃圾回收器(Garbage Collector)管理,当对象不再被引用时,会被垃圾回收器回收以释放内存。堆可以进一步分为新生代(Young Generation)和老年代(Old Generation),新生代又可细分为 Eden 区和两个 Survivor 区。
  • 虚拟机栈(Java Virtual Machine Stacks)
    • 每个线程都有自己独立的虚拟机栈,它是线程私有的。虚拟机栈用于存储方法执行时的栈帧(Stack Frame),每个栈帧包含局部变量表、操作数栈、动态链接和方法返回地址等信息。当一个方法被调用时,会创建一个新的栈帧并压入栈中,方法执行完毕后,该栈帧会从栈中弹出。
  • 本地方法栈(Native Method Stacks)
    • 与虚拟机栈类似,也是线程私有的,不过它是为执行本地方法(使用native关键字修饰的方法)服务的。本地方法通常是用其他语言(如 C、C++)实现的,用于与操作系统进行交互。
  • 程序计数器(Program Counter Register)
    • 每个线程都有一个独立的程序计数器,它是线程私有的。程序计数器用于记录当前线程执行的字节码指令的地址,当线程执行 Java 方法时,它记录的是正在执行的虚拟机字节码指令的地址;当线程执行本地方法时,程序计数器的值为空(Undefined)。

执行引擎(Execution Engine)

执行引擎负责执行字节码指令,它将字节码指令解释或编译成机器码,然后在操作系统上运行。执行引擎主要有以下几种执行方式:

  • 解释器(Interpreter):逐行解释字节码指令并执行,优点是启动速度快,不需要提前编译,但执行效率相对较低。
  • 即时编译器(Just-In-Time Compiler,JIT):将热点代码(经常执行的代码)编译成机器码,提高执行效率。JIT 编译器在运行时动态编译,编译后的机器码可以重复使用。
  • 垃圾回收器(Garbage Collector):执行引擎还负责垃圾回收的工作,它会自动回收不再使用的对象所占用的内存,以避免内存泄漏。常见的垃圾回收器有 Serial、Parallel、CMS、G1 等。

本地方法接口(Native Method Interface,NMI)

本地方法接口允许 Java 程序调用本地方法,本地方法是使用其他语言(如 C、C++)编写的方法。通过本地方法接口,Java 程序可以与操作系统、硬件设备等进行交互,扩展 Java 的功能。本地方法库是一系列本地方法的集合,它包含了实现本地方法的具体代码。

http://www.lryc.cn/news/542499.html

相关文章:

  • 贪心算法
  • Linux下安装中文输入法总结
  • 人工智能(AI):科技新纪元的领航者
  • c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
  • 鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)
  • AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据
  • Ubuntu20.04之VNC的安装使用与常见问题
  • vue3学习3-route
  • C++:dfs,bfs各两则
  • RK Android11 WiFi模组 AIC8800 驱动移植流程
  • 深度学习-6.用于计算机视觉的深度学习
  • 免费送源码:ava+springboot+MySQL 基于springboot 宠物医院管理系统的设计与实现 计算机毕业设计原创定制
  • 【电机控制器】ESP32-C3语言模型——DeepSeek
  • 小型字符级语言模型的改进方向和策略
  • 力扣-贪心-56 合并区间
  • vue 3D 翻页效果
  • 【系列专栏】银行信息系统研发外包风险管控-08
  • [ComfyUI] 【AI】如何获得一张人物图片的优质描述
  • 深度学习基础--ResNet网络的讲解,ResNet50的复现(pytorch)以及用复现的ResNet50做鸟类图像分类
  • stack,queue,priority_queue学习知识点
  • css特异性,继承性
  • 力扣hot100刷题——11~20
  • R语言Stan贝叶斯空间条件自回归CAR模型分析死亡率多维度数据可视化
  • 速通HTML
  • 安装 Milvus Java SDK
  • 云手机如何进行经纬度修改
  • 牛客周赛 Round 82(思维、差分、树状数组、大根堆、前后缀、递归)
  • MQTT实现智能家居------2、写MQTT程序的思路
  • 大模型面试问题准备
  • C语言:二维数组在内存中是怎么存储的