从Hello World!到java虚拟机(JVM)

当开始接触任何一种编程语言时,最开始的程序便是Hello World!,而在Java中,从一个简单的Hello World!,便可打开一个世界。

那么这个世界是什么样子呢?

熟悉Java语言的小伙伴都知道,在Java程序运行的时,底层都会有个JVM,即Java虚拟机,而这个虚拟机又会产生什么样的作用呢?各位看官,且看下面慢慢分解。

  • Hello World!

如下面这段代码

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello,World");
    }
}

 

在JVM中会加载成一个klass模型,Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息……,这些信息又会存储在元空间中。

类的加载过程又分为这样7个阶段,如下图所示:

       

     

     

1、加载:

1)、通过一个类的全限定名加载该类对应的二进制字节流。主要通过类加载器实现。

2)、将字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3)、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区各个类访问该类的入口。(Hotspot 在方法区生成该类)。

2、验证:

1)、文件格式验证:验证类文件的魔术版本号常量等是否符合当前虚拟机支持的范围。

2)、元数据验证:验证类的语义信息,是否符合java语言规范的要求。

3)、字节码验证:验证程序语义是合法的、合乎规范的。主要通过stackmapframe结构。

4)、符号引用验证:虚拟机在将符号引用转化为直接引用,验证符号引用全限定名代表的类是否能够找到,对应的域和方法是否能找到,访问权限是否合法。

3、准备:

准备阶段主要是将类变量(被static修饰符修饰)在方法区进行内存分配并进行初始化。

4、解析:

1)、类或接口解析:将符合引用转化为类的直接引用,并检查访问权限。

2)、字段解析:将字段的符号引用转化为字段所属的类信息或其父类该字段的直接引用,并检查访问权限。

3)、类方法解析:将类方法的符号引用转化为类方法所属的类信息或其父类该字段的直接引用,并检查访问权限。

4)、接口方法解析:将接口方法的符号引用转化为接口方法所属的接口信息或其父类该字段的直接引用,并检查访问权限。

5、初始化:

初始化阶段编译器会将类文件声明的静态赋值变量和静态区域合并生成<cinit>方法并进行调用。

类加载器:类加载器是“通过一个类的全限定名加载这个类的二进制字节流”的实现,对于任何一个类,都是由类加载器和该类的本身共同确定在虚拟机中的唯一性。

 

 

当有一个Java程序Hello World!,在加载过程中,会加载成二进制文件。

这个二进制文件,包含着众多信息,对于字节码文件的分析,在后续更新。

 

     

 

     

 

posted @ 2022-06-30 17:40  陌孜  阅读(56)  评论(0)    收藏  举报