jvm运行流程

Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM的运行流程可以分为几个阶段:加载(Loading)、链接(Linking)、初始化(Initialization)、使用(Using)和卸载(Unloading)。JVM运行时,主要通过类加载器(ClassLoader)、执行引擎(Execution Engine)以及内存区域(Memory Areas)协同工作来完成任务。

类加载(Class Loading)

JVM 启动时,主类(带有 main 方法的类)会被加载。JVM 使用了不同级别的类加载器:

  1. 引导类加载器(Bootstrap Class Loader):用原生代码实现,加载 JVM 基础核心类库。
  2. 扩展类加载器(Extension Class Loader):加载扩展库(jre/lib/ext 或者 Java 系统变量 java.ext.dirs 指定的目录中的 JAR 包)。
  3. 系统类加载器(System/Application Class Loader):加载系统类路径(classpath)上的类库。

在 OpenJDK 源码中,这部分对应的是 ClassLoader 类和 sun.misc.Launcher 类。

// 伪代码 - JVM 类加载
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class<?> mainClass = cl.loadClass("MainClassName");

链接(Linking)

加载后,类会经过以下链接步骤:

  1. 验证(Verification):确保加载的类符合 JVM 规范,检查格式、语法、安全性等。
  2. 准备(Preparation):为类的静态字段分配内存,并设置默认初始化值。
  3. 解析(Resolution):将常量池中的符号引用替换成直接引用。

在 HotSpot 的源码中,可以在 instanceKlass.cpp 中找到类链接的实现。

初始化(Initialization)

类初始化包括为静态变量赋值及执行静态代码块。

// Java 代码 - 类初始化
public class Example {
    static {
        // 代码块,类初始化时执行
        System.out.println("Class Example is initialized.");
    }
}

在 HotSpot 实现中,查看 InstanceKlass::initialize() 方法可以看到类初始化的过程。

执行(Execution)

类被初始化后,JVM 会调用 main 方法开始执行程序。

// 伪代码 - JVM 执行 main 方法
Method m = mainClass.getMethod("main", String[].class);
m.invoke(null, (Object)args);

在 HotSpot VM 源码中,解释器执行字节码的部分由 interpreter.cpp 实现,而 JIT 编译则由 c1_Compiler.cppc2_Compiler.cpp 等文件实现。

垃圾回收(Garbage Collection)

JVM 在堆内存管理对象实例。当对象不再引用时,垃圾收集器会回收内存。这个过程是自动的,但是可以通过代码触发。

System.gc(); // 提示 JVM 进行垃圾回收

垃圾回收的代码分布在 HotSpot 源码中的 share/vm/gc/ 目录下。

退出(Shutdown)

程序执行完毕后或者调用 System.exit() 会触发 JVM 退出流程,JVM 会卸载载入的类,并释放所有的资源。

HotSpot VM 中处理类卸载的相关代码通常在 classLoader.cppsystemDictionary.cpp 中。

总结:

以上各阶段的细节均可在 OpenJDK 的 HotSpot 源码中找到。要理解这些源码,需要具备 C++ 语言的知识,同时对 JVM 的内部结构和工作原理有较深理解。每个 JVM 实现的具体细节可能有所不同,但它们都遵循 JVM 规范。

为了更深入地理解 JVM 的工作原理,建议查阅《深入理解 Java 虚拟机》等专业书籍,并在具备一定基础后,直接阅读 OpenJDK 的源码。同时,可以通过调试工具(如 VisualVM 或 JConsole)来实时监控 JVM 的性能指标和行为。这样做可以帮助你更好地理解 JVM 的运行机制。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值