JVM工作过程

embedded/2024/9/22 20:44:56/

将JVM工作过程粗略分为5个阶段,包括加载阶段、链接阶段、初始化阶段、执行阶段、回收阶段
其中,
(1)加载阶段、链接阶段的解析部分主要由类加载器完成
(2)初始化阶段是由JVM的类加载机制在类加载过程的最后阶段自动触发的。
(3)执行阶段主要由执行引擎负责
(4)回收阶段主要是垃圾收集器(Garbage Collector)负责。

所以,在Java虚拟机(JVM)中,读取字节码文件、解析字节码文件为类信息,并将这些信息存储在运行时数据区的工作主要是由类加载器(ClassLoader)完成的。之后,执行引擎(Execution Engine)会利用这些存储在运行时数据区中的类信息(包括字节码),将其转换为特定平台上的机器码并执行。

1.加载阶段

类加载器负责将类的二进制数据(通常是.class文件)从文件系统、网络或其他来源读取到JVM的内存中。这个过程包括:
(1)通过类的全限定名(Fully Qualified Name)来定位并读取对应的字节码文件。
(2)将这个字节码文件所代表的静态存储结构转化为方法区(在Java 8及以后版本中称为元空间Metaspace)的运行时数据结构。
(3)在内存中生成一个代表这个类的java.lang.Class对象,作为访问方法区中这些类数据的入口。

2.链接阶段

链接阶段包括验证、准备和解析三个子阶段,类加载器主要参与其中的验证和解析阶段(准备阶段不由类加载器直接负责,但也是类加载过程的一部分,在此提及以保持完整性)
(1)验证:验证是类加载过程的一部分,且是在加载阶段之后进行的。验证的目的是确保加载的字节码文件符合Java虚拟机规范,不会危害系统安全。验证包括文件格式验证、元数据验证、字节码验证和符号引用验证等。
(2)准备:为类的静态变量分配内存,并将其初始化为默认值(如int类型的变量初始化为0,对象引用类型的变量初始化为null)。
(3)解析:将类中的符号引用(如字段名、方法名等)替换为直接引用(即内存地址或偏移量)。这一步是类加载器在链接阶段的主要工作之一,它使得JVM在运行时能够直接通过内存地址或偏移量来访问类的字段和方法。

3.初始化阶段

初始化阶段主要是执行类的初始化代码,包括静态代码块和静态变量的赋值操作。
(1)当类被加载、链接(包括验证、准备和解析)之后,如果该类被主动使用(如创建类的实例、访问类的静态变量或静态方法等),JVM就会执行该类的初始化代码,即执行类构造器<clinit>()方法中的代码。
(2)类构造器<clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块(static block)中的语句合并产生的。它只会被执行一次,用于初始化类的静态变量和静态代码块。
(3)需要注意的是,初始化阶段与类的实例化(即创建类的对象)是不同的。类的实例化是通过调用类的构造器(<init>()方法,注意与类构造器<clinit>()区分)来完成的,而类的初始化则是在类被主动使用之前,由JVM自动触发的。

java">public class InitializationExample {  // 静态变量初始化  static int staticVar = 42;  // 静态代码块  static {  System.out.println("Static block executed. staticVar = " + staticVar);  // 可以对静态变量进行修改  staticVar = staticVar * 2;  }  public static void main(String[] args) {  // 访问类的静态变量,触发类的初始化  System.out.println("Accessing static variable: staticVar = " + staticVar);  // 创建类的实例不会再次触发类的初始化,因为<clinit>()方法只执行一次  InitializationExample instance1 = new InitializationExample();  InitializationExample instance2 = new InitializationExample();  // 演示实例变量和构造器  instance1.instanceMethod();  }  // 实例变量  int instanceVar = 10;  // 构造器  public InitializationExample() {  System.out.println("Constructor called. instanceVar = " + instanceVar);  }  // 实例方法  public void instanceMethod() {  System.out.println("Instance method called. instanceVar = " + instanceVar);  }  
}

4.执行阶段

执行引擎可以采用多种技术来实现字节码的执行,主要包括解释执行即时编译(JIT,Just-In-Time Compilation)两种方式。
解释执行:解释器逐条读取字节码指令,并将其翻译成对应平台的机器码执行。这种方式实现简单,但执行效率相对较低,因为每次执行都需要进行翻译。
即时编译:JIT编译器将频繁执行的热点代码编译成目标平台的本地机器码,以提高执行效率。JVM通常会在程序运行时收集执行信息,识别出热点代码,并触发JIT编译。这种方式可以显著提高执行效率,但会增加编译的开销。

5.回收阶段

回收阶段主要是垃圾收集器(Garbage Collector)负责的工作,它回收JVM中不再使用的对象和类。
参考:https://blog.csdn.net/mandy_shandong/article/details/139355123


http://www.ppmy.cn/embedded/110272.html

相关文章

什么是嵌入式?行业前景如何?

目录 什么是嵌入式&#xff1f; 主要特点 常见应用场景 1. 工业自动化 2. 交通运输 3. 智能家居 4. 消费电子 5. 医疗设备 6. 航空航天 7. 物联网&#xff08;IoT&#xff09; 8. 能源管理 行业前景如何&#xff1f; 市场需求强劲 物联网&#xff08;IoT&#xff09;的爆发 汽车…

【深度学习】磁盘的转速影响

深度学习&#xff0c;确切的说是计算机视觉&#xff0c;对磁盘的转速是有要求的。 5400转&#xff0c;7200转&#xff0c;转速要大一点。有的是能调转速的&#xff0c;有的不能。 这次我买的这个服务器调不了。 (base) justinjustin-System-Product-Name:~$ sudo hdparm -I …

科大讯飞 鉴权教程

<?php// 定义HmacWithShaTobase64函数&#xff0c;用于生成HMAC-SHA256签名并进行base64编码 function HmacWithShaTobase64($algo, $data, $key) {return base64_encode(hash_hmac(sha256, $data, $key, true)); }// 模拟assembleAuthUrl函数的功能 function assembleAuth…

嵌入式学习路线+嵌入式校招建议 嵌入式学习面试规划

随着物联网、人工智能以及5G等技术的迅猛发展&#xff0c;嵌入式系统的需求逐渐增多。作为毕业生&#xff0c;如何制定一个合理的学习路线&#xff0c;以确保在找工作、参加校招时有足够的竞争力&#xff0c;是非常重要的。我会为你提供一个更加详细、系统的学习路线建议&#…

828华为云征文:华为云 Flexus X 实例性能测评——SuperBench 一键窥见性能

今天我拿到了华为云 Flexus X 实例&#xff0c;这款云服务是华为云推出的有一款明星产品&#xff0c;面向零售、金融、游戏等行业大多数通用工作负载场景。这次&#xff0c;我们就来测评一下它的性能到底怎么样&#xff01; Flexus 云服务 X 实例 在测评之前&#xff0c;我们…

Vulnhub-RickdiculouslyEasy靶场(9个flag)

flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口&#xff0c;发现一些敏感文件 访问80端口&#xff0c;没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…

chapter09 异常处理 知识点总结Note

文章目录 异常概述Java异常体系常见错误和异常异常处理手动抛出异常对象 throw自定义异常 异常概述 异常指的是程序在执行过程中&#xff0c;出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 异常的抛出机制 Java中把不同的异常用不同的类表示&#xff0…

Zookeeper基本原理

1.什么是Zookeeper? Zookeeper是一个开源的分布式协调服务器框架&#xff0c;由Apache软件基金会开发&#xff0c;专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。 Zookeeper采用了观察者模式的设计理念&#xff0c;其核心…