/javajvm

A toy JVM written in Java

Primary LanguageJavaMIT LicenseMIT

Java JVM

Build Status

使用Java 8来实现一个纯解释执行的Java虚拟机。

代码偏向于可读性,忽略性能。

项目的目的在于更加深入的学习和理解Java虚拟机。

怎么跑起来?

hello, world

release中下载最新的版本的压缩包,解压后,你会看到2个文件

  • HelloWorld.java:未编译的Java代码,里面的内容即将运行在实现的JVM上
  • javajvm-xxx.jar:JVM的实现,本质上是一个jar包,里面放着编译好的Java代码。

xxx代表版本号,不要在Shell中真的输入xxx,请将javajvm-xxx.jar自行换成对应的文件。

javajvm-xxx.jar所在的目录下,命令行中执行

java -jar javajvm-xxx.jar

运行上面的命令后,你会看到一些提示信息。

现在,将HelloWorld.java编译成HelloWorld.class,然后用JVM运行。

javac HelloWorld.java # 编译,会生成文件 HelloWorld.java
java -jar javajvm-xxx.jar HelloWorld # 运行刚刚编译出来的文件

如何用这个JVM跑自己的代码?

修改上述中的文件HelloWorld.java,加入自己写的代码,再重复一次上述的流程即可。

这个JVM是如何实现的?

以下为实现对应的具体代码,目前暂无blog介绍

准备阶段

解析命令行

获取jre路径

创建虚拟机

运行阶段

解析原始的二进制数据

获取class的原始信息(二进制数据)

解析class文件的数据结构

解析后产生的数据结构进一步抽象

常量 - constant

常量池 - constant pool

类加载器 - class loader

类 - class

成员 - field

方法 - method

运行时

线程 - thread

栈帧 - frame

本地变量 - local variables

操作数栈 - operand stack

引用的表示

引用 - reference

null的表示 - the represent of null reference

对象 - object

数组 - array

java.lang.Class

字节码

所有字节码

比较

常量操作

分支控制

数据类型转换

扩展字节码

加载操作数

数学运算

引用

栈操作

存储操作数到本地变量表

我的开发环境

Windows 10 1903

IntelliJ IDEA

Apache Maven 3.6.1

java version "1.8.0_231"

引用

java specification

自己动手写Java虚拟机