c 源码目录,共计约 2w 行代码。
src - 源码目录
├── access.c - 访问权限相关
├── alloc.c - 内存分配
├── alloc.h
├── annotations.c - 注解
├── annotations.h
├── arch.h - cpu 架构, 当前 amd64
├── cast.c - 类型转换, 类型校验
├── class.c - class 文件,以及内存表示
├── class.h
├── classlib.h - classpath, 当前 gnu classpath
├── config.h - 一些宏配置
├── darwin_x86_64 - 操作系统+架构
│ ├── darwin_callNative.S - 汇编实现的函数调用
│ ├── darwin_dll_md.c - 动态库
│ ├── darwin_init.c - 操作系统初始化
│ └── darwin_os.c - 操作系统特有支持
├── dll.c - 动态库
├── excep.c - 异常相关
├── excep.h
├── execute.c - 执行器
├── frame.c - 栈帧
├── frame.h
├── gcp - gnu classpath, 内部是一些特殊或额外实现
│ ├── gcp.h
│ ├── gcp_alloc.c
│ ├── gcp_class.c
│ ├── gcp_dll.c
│ ├── gcp_excep.c
│ ├── gcp_frame.c
│ ├── gcp_jni.c
│ ├── gcp_natives.c
│ ├── gcp_properties.c
│ ├── gcp_reflect.c
│ └── gcp_thread.c
├── hash.c - hash 表实现
├── hash.h
├── hooks.c - 内部钩子
├── init.c - 虚拟机初始化
├── inlining.h
├── interp-indirect.h
├── interp.c - 核心解释器
├── interp.h
├── jam.h - 核心头文件
├── jni-internal.h
├── jni-stubs.c
├── jni.c - JNI 实现
├── jni.h
├── lock.c - pthread lock, monitor
├── lock.h
├── main.c - 启动入口
├── natives.c - 本地方法
├── natives.h
├── properties.c - 属性
├── properties.h
├── reflect.c - 反射
├── reflect.h
├── resolve.c - 解析器
├── shutdown.c - 虚拟机关闭
├── sig.c - 方法签名
├── sig.h
├── string.c - 字符串
├── stubs.c - 桩
├── stubs.h
├── symbol.c - 内部符号
├── symbol.h
├── thread.c - 线程实现, pthread
├── thread.h
├── time.c - 时间工具
├── utf8.c - uft8 工具, 内部有个字符串池
├── zip.c - zip 支持, libz
└── zip.h
2 directories, 69 files
启动入口
- 解析参数
- 初始化虚拟机
- 加载主类
- 准备应用参数
- 调用主类 main 方法
- 处理虚拟机退出
初始化, 主要协调虚拟机内部的组件的初始化顺序。
- 生成虚拟机的默认参数
- 初始化虚拟机
- hooks
- properties
- alloc
- thead stage 1
- uft8
- symbol
- class stage 1
- dll
- monitor
- string
- exception
- natives
- access
- frame
- jni
- interpreter
- class stage 2
- thread stage 2
- gc
lib 目录是 jamvm 为了方便实现复写了一部分 gnu classpath 的一部分 java 代码。
jamvm 在类加载时,启动类加载器会优先加载 lib 编译的 class 文件,