atitit 虚拟机之道vm之道 runtime设计 运行时 .attilax著.docx 1. Atitit 虚拟机的层次 架构与常见的虚拟机 3 1.1. Os隔离了硬件的区别 4 1.2.
2018-02-11 23:05
537 查看
atitit 虚拟机之道vm之道 runtime设计 运行时 .attilax著.docx
1. Atitit 虚拟机的层次 架构与常见的虚拟机 3
1.1. Os隔离了硬件的区别 4
1.2. 4
1.3. Jvm clr又隔离了os的区别 4
1.4. Web 隔离了 vm的区别,webkit vm环境。。 4
1.5. 框架又是一个小的vm环境,ioc容器。。 4
1.6. 4
1.7. Dockert容器 4
1.8. 4
1.9. 安卓虚拟机。。等,可以集成app 4
1.10. Game虚拟机。。 4
2. 4
3. 4
4. Vm的未来 4
4.1. 1.5.1 模块化 1.5.2 混合语言 1.5.3 多核并行 1.5.4 进一步丰富语法 1.5.564位虚拟机 5
5. 自动内存管理机制 5
6. 执行引擎工作原理:方法调用25 6
7. 常量池解析206 6
8. 类变量解析280 8
9. Java栈帧344 8
10. 类方法解析440 9
11. 执行引擎513 10
12. 类的生命周期602 11
13. 垃圾收集器与内存分配策略 13
14. 第4章 虚拟机性能监控与故障处理工具 14
15. 第6章 类文件结构 15
16. 虚拟机类加载机制 16
17. 第8章 虚拟机字节码执行引擎 16
18. 第四部分 程序编译与代码优化 第10章 早期(编译期)优化 17
19. 晚期(运行期)优化 17
20. 第五部分 高效并发 第12章 Java内存模型与线程 18
21. 第13章 线程安全与锁优化 18
22. 两种计算模型 ,堆栈机和状态机(基于寄存器的虚拟机 19
22.1.1. 堆栈机 19
22.1.2. 状态机 20
23. 为什么状态机比堆栈机快呢? 21
23.1. Stack based vm的指令 范例 23
24. 参考 23
25. 附录B 虚拟机字节码指令表 24
25.1. Mov系列指令 24
25.2. Push pop 24
25.3. 24
25.4. 算数逻辑移位 24
25.5. 24
25.6. 跳转指令 24
25.7. Oo指令 24
26. 附录CHotSpot虚拟机主要参数表 24
27. 附录D 对象查询语言(OQL)简介 24
28. 参考资料 25
28.1. Atitit.php opcode虚拟机指令集 分类以及详细解释 25
28.2. 25
28.3. C:\Users\Administrator\Desktop\vm虚拟机设计之道资料包>dir /b 25
28.4. Atitit .jvm 虚拟机指令详细解释.docx 25
28.5. Atitit .jvm 虚拟机指令详细解释.docx.txt 25
28.6. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx 25
28.7. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx.E5A681566CA1E2DE28F6B1BB7072448A.20180208225522212.wps 25
28.8. Atitit vm虚拟机原理与概论book.docx 25
28.9. atitit 虚拟机之道vm之道.attilax著.docx 25
28.10. Atitit 虚拟机的层次 架构与常见的虚拟机.docx 25
28.11. Atitit.java 虚拟机 指令集合.docx 25
28.12. Atitit.java 虚拟机 指令集合.docx.txt 25
28.13. Atitit.php opcode虚拟机指令集 分类以及详细解释.docx 26
28.14. atitit. atitit.基于虚拟机的启动器设计 v2 q37 --java 启动器 java生成exe.docx 26
28.15. Atitit.基于寄存器的虚拟机设计.docx 26
28.16. Atitit.简化的基于堆栈的虚拟机指令 参考java jvm虚拟机指令.docx 26
28.17. Atitit.虚拟机与指令系统的设计.docx 26
28.18. Atitit。虚拟机指令集 的文本形式语法 二进制形式的规范.docx 26
28.19. Atitti.java android反编译解决方案-----虚拟机方案.docx 26
28.20. 《揭秘Java虚拟机:JVM设计原理与实现》(封亚飞)【简介_书评_在线阅读】 - 当当图书.mhtml 26
6.1. 1.5.1 模块化
7. 自动内存管理机制
第2章 Java内存区域与内存溢出异常
2.1 概述
2.2 运行时数据区域
2.2.1 程序计数器
2.2.2 Java虚拟机栈
2.2.3 本地方法栈
2.2.4 Java堆
2.2.5 方法区
2.2.6 运行时常量池
2.2.7 直接内存
第3章
第5章
第6章 2.1 方法调用26
第7章 2.1.1 真实的机器调用26
第8章 2.1.2 C语言函数调用41
第9章 2.2 JVM的函数调用机制47
第10章 2.3 函数指针53
第11章 2.4 CallStub函数指针定义60
第12章 2.5 _call_stub_entry例程72
第13章 2.6 本章总结115
3.1 概述
3.2 对象已死吗
3.2.1 引用计数算法
3.2.2 可达性分析算法
3.2.3 再谈引用
3.2.4 生存还是死亡
3.2.5 回收方法区
3.3 垃圾收集算法
3.3.1 标记-清除算法
3.3.2 复制算法
3.3.3 标记-整理算法
3.3.4 分代收集算法
3.4 HotSpot的算法实现
3.4.1 枚举根节点
3.4.2 安全点
3.4.3 安全区域
3.5 垃圾收集器
3.5.1 Serial收集器
3.5.2 ParNew收集器
3.5.3 Parallel Scavenge收集器
3.5.4 Serial Old收集器
3.5.5 Parallel Old收集器
3.5.6 CMS收集器
3.5.7 G1收集器
3.5.8 理解GC日志
3.5.9 垃圾收集器参数总结
3.6 内存分配与回收策略
3.6.1 对象优先在Eden分配
3.6.2 大对象直接进入老年代
3.6.3 长期存活的对象将进入老年代
3.6.4 动态对象年龄判定
3.6.5 空间分配担保
3.7 本章小结
4.2 JDK的命令行工具
4.2.1 jps:虚拟机进程状况工具
4.2.2 jstat:虚拟机统计信息监视工具
4.2.3 jinfo:Java配置信息工具
4.2.4 jmap:Java内存映像工具
4.2.5 jhat:虚拟机堆转储快照分析工具
4.2.6 jstack:Java堆栈跟踪工具
4.2.7 HSDIS:JIT生成代码反汇编
4.3 JDK的可视化工具
4.3.1 JConsole:Java监视与管理控制台
4.3.2 VisualVM:多合一故障处理工具
4.4 本章小结
6.2 无关性的基石
6.3Class类文件的结构
6.3.1 魔数与Class文件的版本
6.3.2 常量池
6.3.3 访问标志
6.3.4 类索引、父类索引与接口索引集合
6.3.5 字段表集合
6.3.6 方法表集合
6.3.7 属性表集合
6.4 字节码指令简介
6.4.1 字节码与数据类型
6.4.2 加载和存储指令
6.4.3 运算指令
6.4.4 类型转换指令
6.4.5 对象创建与访问指令
6.4.6 操作数栈管理指令
6.4.7 控制转移指令
6.4.8 方法调用和返回指令
6.4.9 异常处理指令
6.4.10 同步指令
6.5 公有设计和私有实现
6.6Class文件结构的发展
6.7 本章小结
7.1 概述
7.2 类加载的时机
7.3 类加载的过程
7.3.1 加载
7.3.2 验证
7.3.3 准备
7.3.4 解析
7.3.5 初始化
7.4 类加载器
7.4.1 类与类加载器
7.4.2 双亲委派模型
7.4.3 破坏双亲委派模型
7.5 本章小结
8.1 概述
8.2 运行时栈帧结构
8.2.1 局部变量表
8.2.2 操作数栈
8.2.3 动态连接
8.2.4 方法返回地址
8.2.5 附加信息
8.3 方法调用
8.3.1 解析
8.3.2 分派
8.3.3 动态类型语言支持
8.4 基于栈的字节码解释执行引擎
8.4.1 解释执行
8.4.2 基于栈的指令集与基于寄存器的指令集
8.4.3 基于栈的解释器执行过程
8.5 本章小结
20. 第四部分 程序编译与代码优化
10.1 概述
10.2Javac编译器
10.2.1Javac的源码与调试
10.2.2 解析与填充符号表
10.2.3 注解处理器
10.2.4 语义分析与字节码生成
10.3Java语法糖的味道
10.3.1 泛型与类型擦除
10.3.2 自动装箱、拆箱与遍历循环
10.3.3 条件编译
10.4 实战:插入式注解处理器
10.4.1 实战目标
10.4.2 代码实现
10.4.3 运行与测试
10.4.4 其他应用案例
10.5 本章小结
11.1 概述
11.2HotSpot虚拟机内的即时编译器
11.2.1 解释器与编译器
11.2.2 编译对象与触发条件
11.2.3 编译过程
11.2.4 查看及分析即时编译结果
11.3 编译优化技术
11.3.1 优化技术概览
11.3.2 公共子表达式消除
11.3.3 数组边界检查消除
11.3.4 方法内联
11.3.5 逃逸分析
11.4Java与CC++的编译器对比
11.5 本章小结
22. 第五部分 高效并发
第12章
12.1 概述
12.2 硬件的效率与一致性
12.3Java内存模型
12.3.1 主内存与工作内存
12.3.2 内存间交互操作
12.3.3 对于volatile型变量的特殊规则
12.3.4 对于long和double型变量的特殊规则
12.3.5 原子性、可见性与有序性
12.3.6 先行发生原则
12.4Java与线程
12.4.1 线程的实现
12.4.2Java线程调度
12.4.3 状态转换
12.5 本章小结
13.2 线程安全
13.2.1Java语言中的线程安全
13.2.2 线程安全的实现方法
13.3 锁优化
13.3.1 自旋锁与自适应自旋
13.3.2 锁消除
13.3.3 锁粗化
13.3.4 轻量级锁
13.3.5 偏向锁
13.4 本章小结
例如,要进行一个1+2的加法运算,那么就:
其典型代表就是Python的虚拟机,代码如下:push 1push 2Add 作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com转载请注明来源: http://blog.csdn.net/attilax
听起来很抽象?
但其实,我们大部分写代码的时候都是对状态机编程,比如c代码:int a = 1;int b = 2;int c = a + b;其实这个状态机有2^96种状态(假设int是32位的),因为变量a有2^32种状态(-2147483648~2147483647),b、c亦然。
典型代表就是Lua的虚拟机,应的代码就是:loadk 0 1loadk 1 2add 2 0 1意思就是:register[0] = 1register[1] = 2register[2] = register[0] + register[1]
那么我们要深入到虚拟机内部,看看这些指令都是怎么实现的。
为了便于大家理解,我所有的代码都不是vm中的实际代码,而是伪代码。
首先来看看堆栈机:switch(op) {case PUSH: STACK_ADJ(1); STACK_TOP = oprand; break;case ADD: STACK_SECOND = STACK_TOP + STACK_SECOND; STACK_ADJ(-1); break;}我们可以看到,大部分情况下,执行一条指令,除了原始的赋值操作外,还需要调整堆栈的栈顶指针(那些STACK_ADJ宏定义),再看看状态机的实现:switch(op) {case LOADK: REGISTER[oprand0] = oprand1; break;case ADD: REGISTER[oprand0] = REGISTER[oprand1] + REGISTER[oprand2]; break;}大家可以看到,在执行大部分指令时,状态机虚拟机会比堆栈机要少一次调整堆栈的操作,这对性能会有很明显的影响。
当然这也主要适用于Interpreting的情况,在Jit的情况下,会有很多深度优化,从而使得堆栈机的性能也能和状态机一样。
28. 附录CHotSpot虚拟机主要参数表
1. Atitit 虚拟机的层次 架构与常见的虚拟机 3
1.1. Os隔离了硬件的区别 4
1.2. 4
1.3. Jvm clr又隔离了os的区别 4
1.4. Web 隔离了 vm的区别,webkit vm环境。。 4
1.5. 框架又是一个小的vm环境,ioc容器。。 4
1.6. 4
1.7. Dockert容器 4
1.8. 4
1.9. 安卓虚拟机。。等,可以集成app 4
1.10. Game虚拟机。。 4
2. 4
3. 4
4. Vm的未来 4
4.1. 1.5.1 模块化 1.5.2 混合语言 1.5.3 多核并行 1.5.4 进一步丰富语法 1.5.564位虚拟机 5
5. 自动内存管理机制 5
6. 执行引擎工作原理:方法调用25 6
7. 常量池解析206 6
8. 类变量解析280 8
9. Java栈帧344 8
10. 类方法解析440 9
11. 执行引擎513 10
12. 类的生命周期602 11
13. 垃圾收集器与内存分配策略 13
14. 第4章 虚拟机性能监控与故障处理工具 14
15. 第6章 类文件结构 15
16. 虚拟机类加载机制 16
17. 第8章 虚拟机字节码执行引擎 16
18. 第四部分 程序编译与代码优化 第10章 早期(编译期)优化 17
19. 晚期(运行期)优化 17
20. 第五部分 高效并发 第12章 Java内存模型与线程 18
21. 第13章 线程安全与锁优化 18
22. 两种计算模型 ,堆栈机和状态机(基于寄存器的虚拟机 19
22.1.1. 堆栈机 19
22.1.2. 状态机 20
23. 为什么状态机比堆栈机快呢? 21
23.1. Stack based vm的指令 范例 23
24. 参考 23
25. 附录B 虚拟机字节码指令表 24
25.1. Mov系列指令 24
25.2. Push pop 24
25.3. 24
25.4. 算数逻辑移位 24
25.5. 24
25.6. 跳转指令 24
25.7. Oo指令 24
26. 附录CHotSpot虚拟机主要参数表 24
27. 附录D 对象查询语言(OQL)简介 24
28. 参考资料 25
28.1. Atitit.php opcode虚拟机指令集 分类以及详细解释 25
28.2. 25
28.3. C:\Users\Administrator\Desktop\vm虚拟机设计之道资料包>dir /b 25
28.4. Atitit .jvm 虚拟机指令详细解释.docx 25
28.5. Atitit .jvm 虚拟机指令详细解释.docx.txt 25
28.6. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx 25
28.7. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx.E5A681566CA1E2DE28F6B1BB7072448A.20180208225522212.wps 25
28.8. Atitit vm虚拟机原理与概论book.docx 25
28.9. atitit 虚拟机之道vm之道.attilax著.docx 25
28.10. Atitit 虚拟机的层次 架构与常见的虚拟机.docx 25
28.11. Atitit.java 虚拟机 指令集合.docx 25
28.12. Atitit.java 虚拟机 指令集合.docx.txt 25
28.13. Atitit.php opcode虚拟机指令集 分类以及详细解释.docx 26
28.14. atitit. atitit.基于虚拟机的启动器设计 v2 q37 --java 启动器 java生成exe.docx 26
28.15. Atitit.基于寄存器的虚拟机设计.docx 26
28.16. Atitit.简化的基于堆栈的虚拟机指令 参考java jvm虚拟机指令.docx 26
28.17. Atitit.虚拟机与指令系统的设计.docx 26
28.18. Atitit。虚拟机指令集 的文本形式语法 二进制形式的规范.docx 26
28.19. Atitti.java android反编译解决方案-----虚拟机方案.docx 26
28.20. 《揭秘Java虚拟机:JVM设计原理与实现》(封亚飞)【简介_书评_在线阅读】 - 当当图书.mhtml 26
1. 为什么需要虚拟机
2.
3. Atitit 虚拟机的层次 架构与常见的虚拟机
3.1. Os隔离了硬件的区别
3.2.
3.3. Jvm clr又隔离了os的区别
3.4. Web 隔离了 vm的区别,webkit vm环境。。
3.5. 框架又是一个小的vm环境,ioc容器。。
3.6.
3.7. Dockert容器
3.8.
3.9. 安卓虚拟机。。等,可以集成app
3.10. Game虚拟机。。
4.
5. 中间语言il
6. Vm的未来
6.1. 1.5.1 模块化
1.5.2 混合语言
1.5.3 多核并行
1.5.4 进一步丰富语法
1.5.564位虚拟机
7. 自动内存管理机制
第2章 Java内存区域与内存溢出异常2.1 概述
2.2 运行时数据区域
2.2.1 程序计数器
2.2.2 Java虚拟机栈
2.2.3 本地方法栈
2.2.4 Java堆
2.2.5 方法区
2.2.6 运行时常量池
2.2.7 直接内存
第3章
8. 执行引擎工作原理:方法调用25
第4章第5章
第6章 2.1 方法调用26
第7章 2.1.1 真实的机器调用26
第8章 2.1.2 C语言函数调用41
第9章 2.2 JVM的函数调用机制47
第10章 2.3 函数指针53
第11章 2.4 CallStub函数指针定义60
第12章 2.5 _call_stub_entry例程72
第13章 2.6 本章总结115
9. 常量池解析206
第5章 5.1 常量池内存分配2085.1.1 常量池内存分配总体链路2095.1.2 内存分配2155.1.3 初始化内存2235.2 oop-klass模型2245.2.1 两模型三维度2255.2.2 体系总览2275.2.3 oop体系2295.2.4 klass体系2315.2.5 handle体系2345.2.6 oop、klass、handle的相互转换2395.3 常量池klass模型(1)2445.3.1 klassKlass实例构建总链路2465.3.2 为klassOop申请内存2495.3.3 klassOop内存清零2535.3.4 初始化mark2535.3.5 初始化klassOop._metadata2585.3.6 初始化klass2595.3.7 自指2605.4 常量池klass模型(2)2615.4.1 constantPoolKlass模型构建2615.4.2 constantPoolOop与klass2645.4.3 klassKlass终结符2675.5 常量池解析2675.5.1 constantPoolOop域初始化2685.5.2 初始化tag2695.5.3 解析常量池元素2715.6 本章总结27910. 类变量解析280
第6章 6.1 类变量解析2816.2 偏移量2856.2.1 静态变量偏移量2856.2.2 非静态变量偏移量2876.2.3 Java字段内存分配总结3126.3 从源码看字段继承3196.3.1 字段重排与补白3196.3.2 private字段可被继承吗3256.3.3 使用HSDB验证字段分配与继承3296.3.4 引用类型变量内存分配3386.4 本章总结34211. Java栈帧344
第7章 7.1 entry_point例程生成3457.2 局部变量表创建3527.2.1 constMethod的内存布局3527.2.2 局部变量表空间计算3567.2.3 初始化局部变量区3597.3 堆栈与栈帧3687.3.1 栈帧是什么3687.3.2 硬件对堆栈的支持3877.3.3 栈帧开辟与回收3907.3.4 堆栈大小与多线程3917.4 JVM的栈帧3967.4.1 JVM栈帧与大小确定3967.4.2 栈帧创建3997.4.3 局部变量表4217.5 栈帧深度与slot复用4337.6 最大操作数栈与操作数栈复用4367.7 本章总结43912. 类方法解析440
第8章 8.1 方法签名解析与校验4458.2 方法属性解析4478.2.1 code属性解析4478.2.2 LVT&LVTT4498.3 创建methodOop4558.4 Java方法属性复制4598.5 <clinit>与<init>4618.6 查看运行时字节码指令4828.7 vtable4898.7.1 多态4898.7.2 C 中的多态与vtable4918.7.3 Java中的多态实现机制4938.7.4 vtable与invokevirtual指令5008.7.5 HSDB查看运行时vtable5028.7.6 miranda方法5058.7.7 vtable特点总结5088.7.8 vtable机制逻辑验证5098.8 本章总结51113. 执行引擎513
第9章 9.1 执行引擎概述5149.2 取指5169.2.1 指令长度5199.2.2 JVM的两级取指机制5279.2.3 取指指令放在哪5329.2.4 程序计数器在哪里5349.3 译码5359.3.1 模板表5359.3.2 汇编器5409.3.3 汇编5499.4 栈顶缓存5589.5 栈式指令集5659.6 操作数栈在哪里5769.7 栈帧重叠5819.8 entry_point例程机器指令5869.9 执行引擎实战5889.9.1 一个简单的例子5889.9.2 字节码运行过程分析5909.10 字节码指令实现5979.10.1 iconst_35989.10.2 istore_05999.10.3 iadd6009.11 本章总结60114. 类的生命周期602
第10章 10.1 类的生命周期概述60210.2 类加载60510.2.1 类加载——镜像类与静态字段61110.2.2 Java主类加载机制61710.2.3 类加载器的加载机制62210.2.4 反射加载机制62310.2.5 import与new指令62410.3 类的初始化62510.4 类加载器62810.4.1 类加载器的定义62810.4.2 系统类加载器与扩展类加载器创建63410.4.3 双亲委派机制与破坏63610.4.4 预加载63810.4.5 引导类加载64010.4.6 加载、链接与延迟加载64110.4.7 父加载器64510.4.8 加载器与类型转换64810.5 类实例分配64910.5.1 栈上分配与逃逸分析65210.5.2 TLAB65510.5.3 指针碰撞与eden区分配65710.5.4 清零65810.5.5 偏向锁65810.5.6 压栈与取指65910.6 本章总结66115. 垃圾收集器与内存分配策略
第14章3.1 概述
3.2 对象已死吗
3.2.1 引用计数算法
3.2.2 可达性分析算法
3.2.3 再谈引用
3.2.4 生存还是死亡
3.2.5 回收方法区
3.3 垃圾收集算法
3.3.1 标记-清除算法
3.3.2 复制算法
3.3.3 标记-整理算法
3.3.4 分代收集算法
3.4 HotSpot的算法实现
3.4.1 枚举根节点
3.4.2 安全点
3.4.3 安全区域
3.5 垃圾收集器
3.5.1 Serial收集器
3.5.2 ParNew收集器
3.5.3 Parallel Scavenge收集器
3.5.4 Serial Old收集器
3.5.5 Parallel Old收集器
3.5.6 CMS收集器
3.5.7 G1收集器
3.5.8 理解GC日志
3.5.9 垃圾收集器参数总结
3.6 内存分配与回收策略
3.6.1 对象优先在Eden分配
3.6.2 大对象直接进入老年代
3.6.3 长期存活的对象将进入老年代
3.6.4 动态对象年龄判定
3.6.5 空间分配担保
3.7 本章小结
16. 第4章 虚拟机性能监控与故障处理工具
4.1 概述4.2 JDK的命令行工具
4.2.1 jps:虚拟机进程状况工具
4.2.2 jstat:虚拟机统计信息监视工具
4.2.3 jinfo:Java配置信息工具
4.2.4 jmap:Java内存映像工具
4.2.5 jhat:虚拟机堆转储快照分析工具
4.2.6 jstack:Java堆栈跟踪工具
4.2.7 HSDIS:JIT生成代码反汇编
4.3 JDK的可视化工具
4.3.1 JConsole:Java监视与管理控制台
4.3.2 VisualVM:多合一故障处理工具
4.4 本章小结
17. 第6章 类文件结构
6.1 概述6.2 无关性的基石
6.3Class类文件的结构
6.3.1 魔数与Class文件的版本
6.3.2 常量池
6.3.3 访问标志
6.3.4 类索引、父类索引与接口索引集合
6.3.5 字段表集合
6.3.6 方法表集合
6.3.7 属性表集合
6.4 字节码指令简介
6.4.1 字节码与数据类型
6.4.2 加载和存储指令
6.4.3 运算指令
6.4.4 类型转换指令
6.4.5 对象创建与访问指令
6.4.6 操作数栈管理指令
6.4.7 控制转移指令
6.4.8 方法调用和返回指令
6.4.9 异常处理指令
6.4.10 同步指令
6.5 公有设计和私有实现
6.6Class文件结构的发展
6.7 本章小结
18. 虚拟机类加载机制
第7章7.1 概述
7.2 类加载的时机
7.3 类加载的过程
7.3.1 加载
7.3.2 验证
7.3.3 准备
7.3.4 解析
7.3.5 初始化
7.4 类加载器
7.4.1 类与类加载器
7.4.2 双亲委派模型
7.4.3 破坏双亲委派模型
7.5 本章小结
19. 第8章 虚拟机字节码执行引擎
第8章8.1 概述
8.2 运行时栈帧结构
8.2.1 局部变量表
8.2.2 操作数栈
8.2.3 动态连接
8.2.4 方法返回地址
8.2.5 附加信息
8.3 方法调用
8.3.1 解析
8.3.2 分派
8.3.3 动态类型语言支持
8.4 基于栈的字节码解释执行引擎
8.4.1 解释执行
8.4.2 基于栈的指令集与基于寄存器的指令集
8.4.3 基于栈的解释器执行过程
8.5 本章小结
20. 第四部分 程序编译与代码优化
第10章 早期(编译期)优化
10.1 概述10.2Javac编译器
10.2.1Javac的源码与调试
10.2.2 解析与填充符号表
10.2.3 注解处理器
10.2.4 语义分析与字节码生成
10.3Java语法糖的味道
10.3.1 泛型与类型擦除
10.3.2 自动装箱、拆箱与遍历循环
10.3.3 条件编译
10.4 实战:插入式注解处理器
10.4.1 实战目标
10.4.2 代码实现
10.4.3 运行与测试
10.4.4 其他应用案例
10.5 本章小结
21. 晚期(运行期)优化
第11章11.1 概述
11.2HotSpot虚拟机内的即时编译器
11.2.1 解释器与编译器
11.2.2 编译对象与触发条件
11.2.3 编译过程
11.2.4 查看及分析即时编译结果
11.3 编译优化技术
11.3.1 优化技术概览
11.3.2 公共子表达式消除
11.3.3 数组边界检查消除
11.3.4 方法内联
11.3.5 逃逸分析
11.4Java与CC++的编译器对比
11.5 本章小结
22. 第五部分 高效并发
第12章 Java内存模型与线程
第12章 12.1 概述
12.2 硬件的效率与一致性
12.3Java内存模型
12.3.1 主内存与工作内存
12.3.2 内存间交互操作
12.3.3 对于volatile型变量的特殊规则
12.3.4 对于long和double型变量的特殊规则
12.3.5 原子性、可见性与有序性
12.3.6 先行发生原则
12.4Java与线程
12.4.1 线程的实现
12.4.2Java线程调度
12.4.3 状态转换
12.5 本章小结
23. 第13章 线程安全与锁优化
13.1 概述13.2 线程安全
13.2.1Java语言中的线程安全
13.2.2 线程安全的实现方法
13.3 锁优化
13.3.1 自旋锁与自适应自旋
13.3.2 锁消除
13.3.3 锁粗化
13.3.4 轻量级锁
13.3.5 偏向锁
13.4 本章小结
24. 两种计算模型 ,堆栈机和状态机(基于寄存器的虚拟机
有了上面的基础只是,我们就知道,堆栈机和状态机不过是两种不同的图灵完整的计算模型而已。24.0.1. 堆栈机
所谓堆栈机,就是计算机的状态是存在于堆栈之中,通过对堆栈中的元素进行运算和调整,来实现计算功能的计算机。例如,要进行一个1+2的加法运算,那么就:
操作 | 堆栈状态 |
初始状态 | |
将1压入栈中 | 1 |
将2压入栈中 | 1, 2 |
调用加法运算 | 3 |
24.0.2. 状态机
状态机的基本原理就在于,它可以有有限种状态,指令能够让它在不同的状态之间进行转换。听起来很抽象?
但其实,我们大部分写代码的时候都是对状态机编程,比如c代码:int a = 1;int b = 2;int c = a + b;其实这个状态机有2^96种状态(假设int是32位的),因为变量a有2^32种状态(-2147483648~2147483647),b、c亦然。
操作 | a的状态 | b的状态 | c的状态 |
初始状态 | 0 | 0 | 0 |
a=1 | 1 | 0 | 0 |
b=2 | 1 | 2 | 0 |
c=a+b | 1 | 2 | 3 |
25. 为什么状态机比堆栈机快呢?
既然他们是图灵等价的,那大家一定会很疑惑,为何状态机比堆栈机快呢?那么我们要深入到虚拟机内部,看看这些指令都是怎么实现的。
为了便于大家理解,我所有的代码都不是vm中的实际代码,而是伪代码。
首先来看看堆栈机:switch(op) {case PUSH: STACK_ADJ(1); STACK_TOP = oprand; break;case ADD: STACK_SECOND = STACK_TOP + STACK_SECOND; STACK_ADJ(-1); break;}我们可以看到,大部分情况下,执行一条指令,除了原始的赋值操作外,还需要调整堆栈的栈顶指针(那些STACK_ADJ宏定义),再看看状态机的实现:switch(op) {case LOADK: REGISTER[oprand0] = oprand1; break;case ADD: REGISTER[oprand0] = REGISTER[oprand1] + REGISTER[oprand2]; break;}大家可以看到,在执行大部分指令时,状态机虚拟机会比堆栈机要少一次调整堆栈的操作,这对性能会有很明显的影响。
当然这也主要适用于Interpreting的情况,在Jit的情况下,会有很多深度优化,从而使得堆栈机的性能也能和状态机一样。
25.1. Stack based vm的指令 范例
一般都是在当前stack中获取和保存操作数的。比如一个简单的加法赋值运算:a=b+c,对于stack based vm,一般会被转化成如下的指令:[plain] view plain copy print?push b; // 将变量b的值压入stack push c; // 将变量c的值压入stack add; // 将stack顶部的两个值弹出后相加,将结果压入stack mov a; // 将stack顶部结果放到a中26. 参考
高效动态语言虚拟机的设计(二) – 堆栈机vs状态机 - 推酷.htm27. 附录B 虚拟机字节码指令表
27.1. Mov系列指令
27.2. Push pop
27.3.
27.4. 算数逻辑移位
27.5.
27.6. 跳转指令
27.7. Oo指令
28. 附录CHotSpot虚拟机主要参数表
29. 附录D 对象查询语言(OQL)简介
30. aot
31. 参考资料
31.1. Atitit.php opcode虚拟机指令集 分类以及详细解释
31.2.
31.3. C:\Users\Administrator\Desktop\vm虚拟机设计之道资料包>dir /b
31.4. Atitit .jvm 虚拟机指令详细解释.docx
31.5. Atitit .jvm 虚拟机指令详细解释.docx.txt
31.6. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx
31.7. Atitit runtime设计 运行时 vm设计 虚拟机设计.docx.E5A681566CA1E2DE28F6B1BB7072448A.20180208225522212.wps
31.8. Atitit vm虚拟机原理与概论book.docx
31.9. atitit 虚拟机之道vm之道.attilax著.docx
31.10. Atitit 虚拟机的层次 架构与常见的虚拟机.docx
31.11. Atitit.java 虚拟机 指令集合.docx
31.12. Atitit.java 虚拟机 指令集合.docx.txt
31.13. Atitit.php opcode虚拟机指令集 分类以及详细解释.docx
31.14. atitit. atitit.基于虚拟机的启动器设计 v2 q37 --java 启动器 java生成exe.docx
31.15. Atitit.基于寄存器的虚拟机设计.docx
31.16. Atitit.简化的基于堆栈的虚拟机指令 参考java jvm虚拟机指令.docx
31.17. Atitit.虚拟机与指令系统的设计.docx
31.18. Atitit。虚拟机指令集 的文本形式语法 二进制形式的规范.docx
31.19. Atitti.java android反编译解决方案-----虚拟机方案.docx
31.20. 《揭秘Java虚拟机:JVM设计原理与实现》(封亚飞)【简介_书评_在线阅读】 - 当当图书.mhtml
相关文章推荐
- Atitit. servlet 与 IHttpHandler ashx listen 和HttpModule的区别与联系 原理理论 架构设计 实现机制 java php c#.net j
- Atitit. servlet 与 IHttpHandler ashx listen 和HttpModule的区别与联系 原理理论 架构设计 实现机制 java php c#.net js javascript c++ python
- Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 1 1.1. ui原型图与html 1 1.2. 业务逻辑 伪代码 各种uml图 1 1.3. 业务逻辑 流程图 ns
- Atitit 架构之道 attilax著 1. 架构的目的是什么??提高架构可读性。。提高扩展性。。对兼容性也有一定提升。。 3 1.1. 伸缩性架构设计 3 1.2. 提升性能架构 3 1.3.
- Atitit 异常处理之道 attilax著.docx 1. 概念 2 1.1. 异常机制的设计原理 2 1.2. Atitit.异常机制的设计原理.docx java 2 1.3. JVM看Exc
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- atitit.系统架构图 的设计 与工具 attilax总结
- atitit.系统架构图 的设计 与工具 attilax总结
- Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。
- Atitit 培训之道 attilax著 1. 概念 培训就是及教育 1 1.1. 知识体系化 2 1.2. 组织架构 2 1.3. 人员架构 梯队化培训 2 2. 培训目标,尽可能与项目相关技术点
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- Atitit.虚拟机与指令系统的设计
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- Atitit.架构设计趋势 设计模式 ---微服务架构 soa
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- Atitit 关于微服务的思考与理解 attilax总结 1.1. 架构的历史 微服务发展历史 Web》soa》msa 1 1.2. 微服务最大特点 独立部署 1 2. 微服务的优点 1 2.1.
- Atitit 架构之道 之 可读性可维护性架构之道 提升效率架构之道 attilax著 艾龙 著 1.1. Hybrid架构 1 1.2. 分层架构是使用最多的架构模式 Layers模式 也称Tie
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python