自己动手写Java虚拟机 笔记

1、java = jvm + 库

2、jvm = 数据类型+内存管理和GC+指令解析+函数调用+多线程+JIT

3、数据类型= 原子类型 + 引用 + 数组

4、动态运行:栈 = PC + 线程栈

每一帧 = 一个调用深度= 局部变量表+操作数栈

5、一个指令执行的例子:

public static float circumference(float r)

{

float pi = 3.14f;

float area = 2 * pi * r;

return area;

}

字节码如下:

00 ldc #4    栈顶 3.14

02 fstore_1  局部数据区 pi

03 fconst_2  栈顶 

04 fload_1局部数据区--》栈顶

05 fmul弹出栈2个数据,结果压栈

06 fload_00号变量(传入的参数r)压栈

07 fmul弹出并运算

08 fstore_2存入area

09 fload_2局部--》栈顶

10 return弹出传给调用者

6、类(Class)和对象(Object)

1》Class= 常量池+(static)域、方法、实例或类变量占空间大小

2》Method=操作数栈和局部变量表大小,方法字节码数组

3》常量池:字面量、字符串引用

4》指令 new putstatic和getstatic;putfield和getfield;instanceof和checkcast;ldc

5》runtime需要维护所有的Class和所有的Object

7、方法调用

invokestatic invokespecial包括构造函数、私有方法和通过super

关键字调用的超类方法。

invokeinterface invokevirtual

invokedynamic 

XXreturn

核心是找到字符串对应的方法区,之后进行解释执行

8、数组的实现

1》数组类由Java虚拟机在运行时生成。数组的类名是左方括号([)+数组元素的类型描述符;数组的类型描述符就是类名本身。例如,int[]的类名是[I,int[][]的类名是[[I,Object[]的类名是[Ljava/lang/Object;,String[][]的类名是[[java/lang/String等等。

2》指令

newarray

anewarray

multianewarray

XXaload和XXastore

arraylength

9、库

1》JNI: 注册和调用本地函数 

2》异常:需要native记录java调用栈的信息

3》Main之前的初始化(System类的native初始化)

猜你喜欢

转载自eric-weitm.iteye.com/blog/2396622