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初始化)
相关推荐
自己动手写Java虚拟机 (Java核心技术系列) 完整数字版
自己动手写Java虚拟机
使用go语言从0开始编写java虚拟机,参考资料有深入java虚拟机第二版和java相关规范
自己动手写Java虚拟机;自己动手写Java虚拟机;自己动手写Java虚拟机;自己动手写Java虚拟机;自己动手写Java虚拟机;
自己动手写Java虚拟机 (Java核心技术系列) 完整版
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的...
自己动手写Java虚拟机 (Java核心技术系列)
自己动手写Java虚拟机 (Java核心技术系列)_943346.epub
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的...
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!, 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的...
1.2 java命令 1.3 编写命令行工具 1.4 测试本章代码 1.5 本章小结 第2章 搜索class文件 2.1 类路径 2.2 准备工作 2.3 实现类路径 2.3.1 Entry接口 2.3.2 DirEntry 2.3.3 ZipEntry 3 2.3.4 ...
自己动手写Java虚拟机(带索引书签目录) 付费收集版PDF文档
深入java虚拟机笔记http://blog.csdn.net/yangzl2008/article/details/8074667