自己动手写Java虚拟机 pdf

自己动手写Java虚拟机

内容简介

Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!

本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的学习变得更加简单和有趣,而且能让你对Java虚拟机的原理认识更深入和更深刻!

本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对Java虚拟机知其然而且知其所以然,还能屏蔽大量不必要的繁琐细节,体会到实现过程中的成就感,让学习过程更加轻松、愉悦和高效。更重要的是,这种方式能引导读者更深入地认识和掌握Java虚拟机的工作原理。

作者简介

张秀宏,资深Java服务器开发工程师,有多年的Java开发、游戏服务器开发和架构经验,对Java虚拟机有非常深入的研究。曾在EA、华娱无线等游戏公司担任高级服务器工程师职位,现任乐元素Lead软件工程师。

目录

前言
第1章 命令行工具 1
1.1 准备工作 1
1.2 java命令 4
1.3 编写命令行工具 5
1.4 测试本章代码 7
1.5 本章小结 8
第2章 搜索class文件 9
2.1 类路径 9
2.2 准备工作 10
2.3 实现类路径 11
2.4 测试本章代码 20
2.5 本章小结 21
第3章 解析class文件 23
3.1 class文件 24
3.2 解析class文件 25
3.3 解析常量池 35
3.4 解析属性表 50
3.5 测试本章代码 61
3.6 本章小结 63
第4章 运行时数据区 65
4.1 运行时数据区概述 66
4.2 数据类型 67
4.3 实现运行时数据区 68
4.4 测试本章代码 81
4.5 本章小结 83
第5章 指令集和解释器 85
5.1 字节码和指令集 86
5.2 指令和指令解码 88
5.2.1 Instruction接口 89
5.2.2 BytecodeReader 91
5.3 常量指令 92
5.3.1 nop指令 92
5.3.2 const系列指令 93
5.3.3 bipush和sipush指令 94
5.4 加载指令 94
5.5 存储指令 95
5.6 栈指令 96
5.6.1 pop和pop2指令 96
5.6.2 dup指令 97
5.6.3 swap指令 98
5.7 数学指令 98
5.7.1 算术指令 98
5.7.2 位移指令 99
5.7.3 布尔运算指令 101
5.7.4 iinc指令 102
5.8 类型转换指令 102
5.9 比较指令 103
5.10 控制指令 108
5.11 扩展指令 111
5.12 解释器 114
5.13 测试本章代码 118
5.14 本章小结 120
第6章 类和对象 121
6.1 方法区 122
6.2 运行时常量池 127
6.3 类加载器 133
6.4 对象、实例变量和类变量 136
6.5 类和字段符号引用解析 141
6.6 类和对象相关指令 144
6.7 测试本章代码 156
6.8 本章小结 160
第7章 方法调用和返回 161
7.1 方法调用概述 161
7.2 解析方法符号引用 163
7.3 方法调用和参数传递 166
7.4 返回指令 169
7.5 方法调用指令 170
7.6 改进解释器 176
7.7 测试方法调用 178
7.8 类初始化 181
7.9 本章小结 185
第8章 数组和字符串 187
8.1 数组概述 187
8.2 数组实现 188
8.3 数组相关指令 191
8.4 测试数组 203
8.5 字符串 204
8.6 测试字符串 207
8.7 本章小结 210
第9章 本地方法调用 211
9.1 注册和查找本地方法 212
9.2 调用本地方法 213
9.3 反射 215
9.4 字符串拼接和String.intern()方法 225
9.5 Object.hashCode()、equals()和toString() 231
9.6 Object.clone() 233
9.7 自动装箱和拆箱 235
9.8 本章小结 238
第10章 异常处理 239
10.1 异常处理概述 239
10.2 异常抛出 240
10.3 异常处理表 241
10.4 实现athrow指令 245
10.5 Java虚拟机栈信息 248
10.6 测试本章代码 251
10.7 本章小结 252
第11章 结束 253
11.1 System类是如何被初始化的 253
11.2 初始化System类 255
11.3 System.out.println()是如何工作的 258
11.4 测试本章代码 260
11.5 总结 260
附录 指令表 263

感悟与笔记

java虚拟机的作用

java虚拟机的作用就是解释class文件中的java指令。每一条java指令,java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

java虚拟机的组成

一个最最简单的虚拟机demo只需要类加载器和执行引擎。
类加载器负责解析class文件,获取类的信息,如常量信息,变量信息,Java方法的指令等等,并将这些信息有组织的存在内存中,通常这个内存区域被称为方法区。

执行引擎负责按照虚拟机规范,逐条解释指令,java虚拟机是基于栈的,大部分操作数都是从操作数栈和变量表中取,并将结果存放在操作数栈中。

笔者在虚拟机demo中实现bootstrap加载器,用来加载运行时class文件(rt.jar)和用户自己的class文件,并没有实现规范中双亲委托加载模式,让系统class文件的包名用java开头(如java.lang, java.io), 而用户的class文件包名不允许java开头感觉也能避免恶意替换系统class文件的隐患。

一些成熟的商用java虚拟机实现中,方便管理和明确用途,会把内存分成不同的区域:

  1. 如前面提到的方法区。
  2. pc寄存器,存储下一条执行指令的地址, 其实这是一个逻辑概念。如果运行时有办法获取下一条指令的地址,也可以没有pc寄存器呢。但是在多线程,各种跳转的情况下,运行时很难获取下一条指令的地址,pc寄存器一般是和线程相关的。
  3. java栈,实现java方法的调用,传参,局部变量存储,函数返回等,java栈也是和线程相关的。
  4. 本地栈,实现native函数调用。
  5. 存储对象的堆,这个是垃圾回收器重点关注的区域。

java虚拟机还有一个重要模块是垃圾回收器,就像令人尊敬的环卫工作人员一样,默默的处理了一些糟糕杂乱的垃圾,让你拥有更好的生活环境。

java之父詹姆斯大叔为了简化程序员的工作,提高开发效率, 程序员只能负责对象的出生,却不能宣判对象的死亡。每个对象默认都是长生不老,只要内存足够,就会一直存活。 但是实际上,资源都是有限的,内存不足时,没有回收一些无用的对象释放内存, 新生的对象就没有内存存储。

垃圾回收器就是定期或者说是某种条件下触发开关,执行清理不再使用的对象,释放内存的任务。

所以感谢虚拟机,感谢垃圾回收器吧。 没有垃圾回收器,java也许会和cpp一样, 各种悬指针,野指针,泄露问题让你头疼不已。

java虚拟机的开发

  1. 语言选取,不考虑性能,理论上都可以。 用java语言或者脚本实现java虚拟机都没问题。只要能够处理文件io就行。
  2. 标准rt.jar很庞大,基本会覆盖所有指令。开发虚拟机时可以自己实现简易版的rt.jar, 简单的实现一些运行时class。 由于重点不是写rt.jar,可以暂时由native实现。为了更好的移植性,native最好只实现OS相关的代码。
    为了调试方便, 笔者选择了用C语言。

java虚拟机的测试

  1. 解析标准rt.jar.
  2. 运行简单小程序。
  3. java指令覆盖率。

java虚拟机的优化

  1. 类查找, 为了省事,实现时用动态数组存储,查找只能遍历。提高查找效率,可以用map存储。
  2. 指令实现,还有很多指令没有实现,为了可读性,每一个指令都是用一个native函数实现的,效率很低。可以学习JIT等技术。
  3. 多线程支持,为了能快速运行java小程序没有支持多线程.
  4. pc寄存器,之前没有理清思路,所以没有pc寄存器。所以暂不支持goto switch throws 等指令。
  5. 没有实现debugger便于开发时调试。
  6. 自己实现的rt.jar基本没有java代码,都是native实现。非OS相关的,尽量用java实现,方便移植,native实现最小核心功能。
  7. 垃圾回收器没有实现。

会员免费下载

链接:https://pan.baidu.com/s/1vEbh1ciCQTjqvuI-1UkfEQ

提取码: ****** 查看

¥69/年 开通VIP会员

成为本站VIP会员即可无限下载。 请先点击百度网盘,看资源是否还在,不在请点击链接通知站长补资源。

资源标签点击标签可查看对应分类的资源

Java

资源推荐

免费 图解数据结构:使用Java

C++ 程序设计语言:第4部分 标准库(原书第4版)

C++编程思想(两卷合订本)

CSS世界

JavaScript DOM编程艺术(第2版)

C++ Primer Plus(第6版) 中文版

Vue.js快速入门

Java编程思想(第4版) [thinking in java]

Copyright © 2021-2022 知识猫. All Rights Reserved.