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初始化)