【自己动手写JVM】02.如何讲起

104 阅读2分钟

本系列文章的顺序

我们知道,java代码会被编译器编译成字节码,而jvm,就是用来解析和执行这些字节码的程序啦。jvm的工作就是和这些类文件(.class)打交道。
因此后续的文章将会从按照找到,解析和使用这些.class文件的顺序来进行。也会顺便从jvm的角度解释一些java的知识点(比如动态绑定、反射)

对应到类的七个生命周期,
载入→验证→准备→解析→初始化→使用→卸载 就是:
1.如何找:
载入中使用双亲委派根据包名类名寻找.class文件(即class文件链接)
2.如何解析
(1)载入中对类文件的解析(涉及类文件结构),解析完成后在堆区生成对应Class的对象
3.如何使用
(1)类使用前的准备工作:验证、准备、解析
(2)类使用前的初始化:初始化。具体就是调用类初始化方法。这个方法是类编译的时候自己生成的。jdk会将静态字段赋值,静态代码块编译成一个类的初始化方法(cinit)
(3)方法的执行:这部分会解释java代码写的方法是怎么运行的(JVM指令),是如何被调用与传递参数的(main函数入口、方法栈帧、反射),对象是怎么创建和使用的(堆区、字符串池),以及为了实现一些功能如IO反射而定义的特殊方法(本地方法)。

当然jvm远远不止这些。还有像多线程(只写了最简单的)和垃圾回收算法(写了,但经常出bug)等是分重要的内容。不过完成上面的内容,辅以本地方法,已经能跑大部分单线程程序了。
像我在 【目录】\jre\ext\example.jar下,就定义的几十个测试样例。这些都是能够在ColdSpot_JVM下执行的程序!

image.png image.png

样例程序执行

运行样例程序:模板模式

image.png

运行样例程序:扫雷

image.png

image.png