用Java实现JVM
本专题按照《java虚拟机规范》、go语言版《自己动手写Java虚拟机》来实现自己的java版虚拟机。从而深入学习jvm的基础功能;搜索和解析class、字节码指令集、运行时数据区、虚拟机栈、栈桢、局部变量表、操作数栈、寄存器等是如何一步步将java代码运行起来的。
小傅哥
博客 bugstack.cn - 汇总所有文章 | 一线互联网软件开发工程师,擅长编写优秀的代码、中间件开发、架构设计等。| 公众号:bugstack虫洞栈,回复:设计模式、面经手册、字节码编程,可以下载我的PDF!
展开
-
用Java实现JVM第一章《命令行工具》
背景描述为了更好的学习jvm阅读过《Java虚拟机规范》、《自己动手写Java虚拟机》,尤其是《自动动手写java虚拟机》可以更加清晰的看到全貌。对于程序开发者来说学习一个新东西最好事必躬亲,亲力亲为的做出一些demo,只有输出了结果心里才踏实。案例简述本章节主要是通过编写java代码,从main方法入口进行获取指令。例如;-version环境准备1、jdk 1.8.02、Intell...原创 2019-05-06 14:34:59 · 2050 阅读 · 0 评论 -
用Java实现JVM第二章《搜索class文件》
案例简述本章节主要了解Java虚拟机从哪里寻找class文件并且读取class内字节码环境准备1、jdk 1.8.02、IntelliJ IDEA Community Edition 2018.3.1 x643、Notepad++ (插件安装HEX-Editor,用于查看class字节)配置信息1、调试配置2.1、配置位置:Run/Debug Configurations ->...原创 2019-05-06 14:35:47 · 1661 阅读 · 0 评论 -
用Java实现JVM第三章《解析class文件》
案例介绍本案例主要介绍通过java代码从class文件中解析;class文件、常量池、属性表;作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类。为了使java程序可以“编写一次,处处运行”,Java虚拟机规范对class文件格式进行了严格的规定。但是另外一方面,对于从哪里加载class文件,给了足够多的自由。Java虚拟机实现可以从文件系统读取和从JAR(或ZIP)压缩包...原创 2019-05-06 14:36:29 · 1512 阅读 · 0 评论 -
用Java实现JVM第三章《解析class文件》附[classReader拆解]
案例介绍按照如下虚拟机规范,本文主要介绍java版本jvm提取class字节码方式。在java中没有无符号类型,例如js中byte取值是0~256、java中是-128 ~ +172,所以在实际处理字节码时[虚拟机规范u1、u2、u4],需要进行转换。[java虚拟机规范]每个Class文件都是由8字节为单位的字节流组成,所有的16位、32位和64位长度的数据将被构造成2个、4个和8个8字节...原创 2019-05-06 14:37:06 · 1494 阅读 · 0 评论 -
用Java实现JVM第四章《运行时数据区》
案例介绍本案例初步实现运行时数据区里;线程、Java虚拟机栈、帧、操作数栈、局部变量表。在运行Java程序时,Java虚拟机需要使用内存来存放各种各样的数据。Java虚拟机规范把这些内存区域叫作运行时数据区。运行时数据区可以分为两类:一类是多线程共享的,另一类则是线程私有的。多线程共享的运行时数据区需要在Java虚拟机启动时创建好在Java虚拟机推出时销毁。线程私有的运行时数据区则在创建线程...原创 2019-05-06 14:37:40 · 1467 阅读 · 0 评论 -
用Java实现JVM第五章《指令集和解释器》
案例介绍本案例通过java代码实现jvm规范中指令集和解释器,完成后就可以开始执行1到100的加和计算。Java虚拟机顾名思义,就是一台虚拟的机器,而字节码(bytecode)就是运行在这台虚拟机器上的机器码。我们已经知道,每一个类或者接口都会被Java编译器编译成一个class文件,类或接口的方法信息就放在class文件的method_info结构中。如果方法不是抽象的,也不是本地方法,方...原创 2019-05-06 14:38:09 · 1537 阅读 · 0 评论 -
用Java实现JVM第六章《类和对象》
案例介绍本案例通过java代码实现jvm规范中指令集和解释器,完成后就可以开始执行1到100的加和计算。Java虚拟机顾名思义,就是一台虚拟的机器,而字节码(bytecode)就是运行在这台虚拟机器上的机器码。我们已经知道,每一个类或者接口都会被Java编译器编译成一个class文件,类或接口的方法信息就放在class文件的method_info结构中。如果方法不是抽象的,也不是本地方法,方...原创 2019-05-06 14:38:45 · 1485 阅读 · 2 评论 -
用Java实现JVM第七章《方法调用和返回》
案例介绍本章节主要用java实现;方法调用指令、返回指令、解析方法符号引用、参数传递等。实现新的指令后我们的虚拟机就可以执行稍微复杂的运算并输出结果。从调用的角度来看,方法可以分为两类:静态方法(或者类方法)和实例方法。静态方法通过类类调用,实例方法则通过对象引用来调用。静态方法是静态绑定的,也就是说,最终调用的是哪给方法在编译期就已经确定。实例方法则支持动态绑定,最终要调用哪给方法可能要推...原创 2019-05-06 14:39:14 · 1556 阅读 · 0 评论 -
用Java实现JVM第八章《数组和字符串》
案例介绍本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串。本章需要新增实现数组指令;newarray、anewarray、arraylength、aload、astore、multianewarray、ldc,同时需要需要开发字符串池方法等。数组在Java虚拟机中是给比较特殊的概念,主要有以下原因;首先,数组类和普通的类是不同的。普...原创 2019-05-06 14:39:44 · 1522 阅读 · 0 评论 -
用Java实现JVM第九章《本地方法调用》
案例介绍本章主要介绍用java实现一些本地方法类库,并初始化本地方法,之后通过反射命令来调用本地方法。Java虚拟机和Java类库一起构成了Java运行时环境。Java类库主要用Java语言编写,一些无法用Java语言实现的方法则使用本地语言编写,这额方法叫作本地方法。OpenJDK类库中的本地方法是用JNI(Java Native Interface)编写的,但是要让虚拟机支持JNI规范...原创 2019-05-06 14:40:12 · 1761 阅读 · 0 评论