代码是如何在JVM中跑起来的呢?

91 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

代码是如何在JVM中跑起来的呢?

在平时的开发过程中,我们编写的是java文件,会通过编译生成class文件,这些文件会打成一个jar包或者war包。可以在tomcat中,或者直接通过java命令启动,这个启动就是启动一个JVM进程。JVM进程在运行过程中,要通过类加载器,将class文件加载到JVM中,这样才可以执行jar包中的类文件。

VM在什么情况下会加载一个类?

其实答案非常简单,就是在你的代码中用到这个类的时候

简单概括一下:首先你的代码中包含“main()”方法的主类一定会在JVM进程启动之后被加载到内存,开始执行你的“main()”方法中的代码

接着遇到你使用了别的类,比如“ReplicaManager”,此时就会从对应的“.class”字节码文件加载对应的类到内存里来。

类加载的流程

一个类从加载到使用,一般会经历下面的这个过程:

加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载


准备阶段:

验证、准备、解析

验证: 验证class文件是否符合JVM的文件规范,防止文件被篡改

准备: 给类分配空间,并将类中的静态变量(也就是static修饰的变量)分配内存空间,来一个默认的初始值

解析:实际上是把符号引用替换为直接引用的过程,其实这个部分的内容很复杂

初始化阶段:

在类已经加载到JVM中,并为静态变量分配空间并赋予默认的初始值。接下来,就是初始化阶段,初始化阶段和准备阶段不一样。准备阶段是给静态变量默认值,初始化阶段是给静态变量真正的值。初始化才是类的真正初始化操作。同时 static静态代码块,也会在这个阶段来执行

使用阶段:

在使用阶段,就是真正的实例化对象操作,也就是new 操作只有第一次使用这个类,并发现这个类没有被加载,才会通过类加载器进行加载。只要被加载过一次,第二次再进行加载的时候,类加载器会发现这个类已经加载过,不再重新加载。直接进行实例化操作。