JJvm,Java开发的Java虚拟机

Stella981
• 阅读 723

背景

这是一个Java实现的JAVA虚拟机,它会非常简单,实际上简单的只够运行HelloWorld。虽然简单,但尽量符合 JVM 标准,目前主要参考依据是《Java虚拟机规范 (Java SE 7 中文版)》

非原创,基于项目 https://github.com/caoym/jjvm ,改造后的项目在 https://github.com/huangwei2013/jjvm,主要改动为:

  • 运行方式有改动 (原项目运行方式在我的环境不work)

  • pc处理机制有修改

    原实现无法支持条件跳转(原项目计算跳转偏移量有错误)

  • opcode 新增指令

    增加if_cmple,goto 增加iload_n

说明

opcode实现并不难,主要是200多个指令的工作量。 难度主要是GC,如果要尝试,换go版的比较靠谱

参考项目

用法

环境

SUN jdk1.8 (OpenJdk1.8 运行缺少一些jar,用SUN JDK重装后解决)

$java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

设置java环境

将以下内容加入 /etc/profile ,保存后执行 source /etc/profile 使之生效

JAVA_HOME=/usr/java/jdk1.8.0_211-amd64
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

编译和运行

可以通过以下编译命令运行:

Sample1

基本HelloWorld

#编译 sample1
$javac org/caoym/jjvm/JJvm.java -XDignore.symbol.file=true
$javac org/caoym/jjvm/JJvm.java -Xlint:unchecked
$javac org/caoym/samples/sample1/HelloWorld.java 

#运行
$java org.caoym.jjvm.JJvm . org.caoym.samples.sample1.HelloWorld

Sample2

带有Interface、父子类继承的Helloworld

#编译 sample2
$javac org/caoym/jjvm/JJvm.java -XDignore.symbol.file=true
$javac org/caoym/jjvm/JJvm.java -Xlint:unchecked
$javac org/caoym/samples/sample2/Main.java 

#运行(不加运行参数如inputVar1,会报错)
$java org.caoym.jjvm.JJvm . org.caoym.samples.sample2.Main inputVar1         

Sample3

带有条件跳转的Helloworld

#编译 sample3
$javac org/caoym/jjvm/JJvm.java -XDignore.symbol.file=true
$javac org/caoym/jjvm/JJvm.java -Xlint:unchecked
$javac org/caoym/samples/sample3/HelloWorld.java 

#运行
$java org.caoym.jjvm.JJvm . org.caoym.samples.sample3.HelloWorld

Sample4

线程

#编译 sample4
$javac org/caoym/jjvm/JJvm.java -XDignore.symbol.file=true
$javac org/caoym/jjvm/JJvm.java -Xlint:unchecked
$javac org/caoym/samples/sample4/TestThread.java 

#运行
$java org.caoym.jjvm.JJvm . org.caoym.samples.sample4.TestThread

FAQ

error: package jdk.internal.org.objectweb.asm does not exist

默认 javac 不读取 rt.jar 中 classes内容,只读取符号表
    符号表一般只包括标准API和部分其他API,如 com.sun., com.oracle. and sun.*
    
编译选项加上 -XDignore.symbol.file=true
    javac org/caoym/jjvm/JJvm.java -XDignore.symbol.file=true

未能自动清理旧class文件,重新编译前手动清理一下,执行

$find . -name *.class -type f -print -exec rm -rf {} \;
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
JVM的基础知识点Java的内存模型
阅读文本大概需要3分钟。Java虚拟机是Java工程师必学的进阶功课,这段时间开始死磕JVM。今天梳理一下JVM的基础知识点Java的内存模型!!(https://oscimg.oschina.net/oscnet/d48bb92f83f6e209089d8c03dc2ba35cf45.png)程序计数器是什么:程序计数器是
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了