简介
本来打算直接看 ART 的源码,一看 Android P 的已经十分庞大了,所以打算找一个小型的 JVM 热热身,想起了以前功能机上的 Java KVM,但是又太过古老。翻 github 偶然翻到一个开源的 Mini Jvm,竟然还支持 Java8 标准,所以准备以此入手了解 JVM。
Mini JVM
MiniJVM 原始 repo:https://github.com/digitalgust/miniJVM
个人加了注释的版本:https://github.com/ganyao114/miniJVM/tree/doc
架构
作者本人的图:
特性
麻雀虽小五脏俱全:
- 完整的跨平台性,支持 Android/IOS/Mac/Linux/Windows
- 支持到 Java8 字节码
- 无需依赖,MiniJvm 的 List,Map 等 lib 都是自带的
- Thread/Network/IO/JNI/GC/Debug 等基本特性的支持
- GUI lib 支持
技术特征
- 运行模式:基于堆栈的 Switch 解释器
- 内存管理:使用开源小巧的 LTALLOC 库
- GC:Mark - Sweep ,单线程,不支持并行
- 未实现部分:Reference 暂未实现
源码结构
-
binary/-------- 编译结果 (win32/win64/mac/linux)
-
mini_jvm/------ minijvm 源码©
-
javalib/------- minijvm 的核心库,相当于 JDK 的 rt.jar
-
ex_lib/
-
- jni_gui/------ pc 的 GUI 库
-
- luaj/--------- lua 的库,因为这个虚拟机本意是给小游戏服务的,所以需要支持 lua
-
mobile/
-
- c/------------- java native lib, glfm framework, gui jni, glfmapp
-
- java/guilib---- java jni for above /mobile/c native gui lib
-
- java/ExApp----- java app entry point
-
- iosapp/-------- iOS launcher
-
- androidapp/---- Android launcher
-
- assets/resfiles/- java app resource, font files, jar files ,pic etc.
-
test/
-
- javalib_test/- test /javalib classes.
-
- jni_test/----- jni example
-
- jvm_ios/------ ios swift test project ,only test the jvm.
-
- jvm_macos/---- macosX test project, only test jvm.
-
- jvm_vs/------- virtual studio test project, only test jvm.
需要着重介绍一下 mini_jvm 目录:
-
mini_jvm/
-
- jvm/ ----- mini jvm 的核心源码
-
-
- class_loader ---- 类加载相关源码
-
-
-
- class ---- 描述 java 的类,以及类的创建/销毁/初始化/成员解析等各种操作
-
-
-
- garbage ----- 内存管理和 GC
-
-
-
- global ----- 虚拟机运行时需要的全局的参数/变量/常量
-
-
-
- interpreter ----- 解释器(Switch)
-
-
-
- java_native_io ----- java 原生 IO 的实现,包括 Socket IO 和 文件 IO
-
-
-
- java_native_reflect ------ java 反射实现
-
-
-
- java_native_std ------ java 标准库实现,和字节码命令对应的函数实现
-
-
-
- jdwp ------ 远程调试器
-
-
-
- jvm_util ------ jvm 一些工具方法,包括线程操作
-
-
-
- jvm ------ 描述 jvm 的一些核心数据结构,和一些核心方法实现
-
-
-
- runtime ------ 每执行到一个方法都会创建一个 Runtime,Runtime 相当于方法栈
-
-
- utils/ ----- 一些基础工具代码,如 List/Map/thread 的实现,为了方便的移植到各个平台,甚至是嵌入式平台