记得2年前,还在学java的时候,偶然读到《自己动手写java虚拟机》这本书,作者用go根据java规范实现了jvm。当时觉得贼厉害,于是用c++跟着作者一起实现。还打算在csdn水文章。
跟着写了八个月,jvm功能完备了(部分地方还进行了改进,比如加入了双亲委派、实现符号解析、支持输入输出、增加debug输出jvm运行步骤、尝试开发回收算法、写了一堆样例程序比如扫雷游戏供jvm执行),还按jdk整理了一下格式。但csdn的文章写了几篇就没下文了,,,更没想到现在工作不写代码了
闲着也是闲着,摸鱼抽空把当时的坑填上(尝试~),
当然不少东西都还给老师了,错误那是大大滴有,希望大佬们指出(别骂了别骂了呜呜呜)
开发语言、环境和GitHub
使用c++,vc++6.0进行开发。c++我是半吊子,不过开发中够用了(如果只管实现功能的话)
不过效率实在是慢,内存回收也感人,甚至出现过跑一个程序占用几个G的神奇现象!因此给jvm起名为cold_spot...
github:github.com/ITWokeman/C…
代码在目录下include的jvm_code里。点击目录下的bin文件夹里的Cold_JVM.exe即可执行
实现功能
(1).支持200+指令码,运行简单java程序没问题。
何止没问题,我还写了个扫雷游戏供其运行呢。扫雷游戏在jre里,使用方法见这个文件夹下的说明
(2).支持部分反射功能(获取类名,方法名,字段名)
(3).垃圾回收机制(有点bug,回收时可能会卡死)
(4).执行简单的多线程程序
(5).java程序运行展示执行过程(附加)
(6).utf8格式下3500常用中文符号输入输出(附加)
(7).配置文件读取和jvm初始化(附加)
各模块与说明
1.类加载执行子系统
(1)双亲委派模式加载类文件
(2)类的生命周期
①载入:双亲委派模式加载.class文件、.class文件解析成类结构、堆区生成对应类的对象
②验证:四部校验未完成
③准备:计算字段id、分配静态字段表空间、初始化静态字段
④解析:解析符号引用
2.字节码执行引擎
(1)实现线程创建与调度
(2)实现JVM指令集
(3)实现解释器,解释执行线程程序
3.本地方法库
(1)实现部分本地方法,以便实现程序输入输出、字符串拼接、反射获取类信息等功能
4.运行时数据区
(1)实现方法区,存放类信息
(2)实现堆区及各个部分(新生代、老年代),实现对象内存分配
(3)实现字符串常量池,实现字符串共享
(4)部分实现垃圾回收机制(GCRoot+标记复制算法,有bug)
5.JVM入口
(1)处理控制台输入的命令
6.虚拟机配置文件解析器
(1)读取JVM配置信息