手写JVM
文章平均质量分 89
周周包
这个作者很懒,什么都没留下…
展开
-
用Java手写JVM第八章——数组和字符串
本章分为两部分,前半部分讨论数组和数组相关指令,后半部分讨论字符串。Java虚拟机直接支持数组,对字符串的支持则由java.lang.String和相关的类提供。一、数组概述数组在Java虚拟机中是给比较特殊的概念,主要有以下原因;首先,数组类和普通的类是不同的。普通的类从class文件中加载,但是数组类由Java虚拟机在运行时生成。数组的类名是左方括号([)+数组元素的类型描述符;数组的类型描述符就是类名本身。例如,int[]的类名是[I,int[][]的类名是[[I,Object[]的类名是[Lj原创 2021-06-16 19:51:46 · 534 阅读 · 0 评论 -
用Java手写JVM第七章——方法调用和返回
第4章实现了Java虚拟机栈、帧等运行时数据区,为方法的执行打好了基础。第5章实现了一个简单的解释器和150多条指令,已经可以执行单个方法。第6章实现了方法区,为方法调用扫清了障碍。本章将实现方法调用和返回,在此基础上,还会讨论类和对象的初始化。一、方法调用概述二、解析方法符号引用三、方法调用和参数传递四、返回指令五、方法调用指令六、改进解释器七、测试方法调用八、类初始化...原创 2021-06-13 14:21:25 · 1733 阅读 · 1 评论 -
用Java手写JVM第六章——类和对象
我们来总结一下。第1章实现了命令行。第2章实现了类路径,可以找到class文件,并把数据加载到内存中。第3章实现了class文件解析,可以把class数据解析成一个ClassFile结构体。在第4章,我们初步实现了线程私有的运行时数据区,在此基础上,第5章实现了一个简单的解释器和150多条指令。这些指令主要是操作局部变量表和操作数栈、进行数学运算、比较运算和跳转控制等。本章将实现线程共享的运行时数据区,包括方法区和运行时常量池。本章将进一步处理ClassFile结构体,把它加以转换,放进方法区以供后续使用原创 2021-06-08 14:57:39 · 946 阅读 · 0 评论 -
用Java手写JVM第五章——指令集和解释器
由第3章可知,编译之后的Java方法以字节码的形式存储在class文件中。在第4章中,初步实现了Java虚拟机栈、帧、操作数栈和局部变量表等运行时数据区。本章将在前两章的基础上编写一个简单的解释器,并且实现大约150条指令。一、字节码和指令集字节码就是运行在Java虚拟机上的机器码。我们已经知道,每一个类或者接口都会被Java编译器编译成一个class文件,类或接口的方法信息就放在class文件的method_info结构中。如果方法不是抽象的,也不是本地方法,方法的Java代码就会被编译器编译成字节码原创 2021-05-23 18:52:25 · 1504 阅读 · 0 评论 -
用Java手写JVM第四章——运行时数据区
一、运行时数据区概述在运行Java程序时,Java虚拟机存放各式各样的数据的内存区域叫作运行时数据区。运行时数据区可以分为两类:一类是多线程共享的,另一类则是线程私有的。多线程共享的运行时数据区需要在Java虚拟机启动时创建好,在Java虚拟机退出时销毁。线程私有的运行时数据区则在创建线程时才创建,线程退出时销毁。多线程共享的内存区域是堆和方法区。对象数据存放在堆中;类数据存放在方法区中,类数据包括字段和方法信息、方法的字节码、运行时常量池等。逻辑上讲,方法区也是堆的一部分。线程私有的运行时数据区用原创 2021-05-22 15:51:37 · 395 阅读 · 0 评论 -
用Java手写JVM第三章——解析class文件
一、class文件上一章我们加载了class文件。构成class文件的基本数据单位是字节,可以把整个class文件当成一个字节流来处理。稍大一些的数据由连续多个字节构成,这些数据在class文件中以大端(big-endian)方式存储。为了描述class文件格式,Java虚拟机规范定义了u1、u2和u4三种数据类型来表示1、2和4字节无符号整数。相同类型的多条数据一般按表(table)的形式存储在class文件中。表由表头和表项(item)构成,表头是u2或u4整数。假设表头是n,后面就紧跟着n个表项数原创 2021-05-22 15:34:05 · 432 阅读 · 0 评论 -
用Java手写JVM第二章——搜索class文件
第1章介绍了java命令如何启动Java应用程序:首先解析命令行参数,启动JVM,将主类加载进JVM,最后调用主类的main()方法。例如一个HelloWorld程序:public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }加载HelloWorld类之前,首先要加载它的父类,也就是java.lan原创 2021-05-18 20:51:48 · 761 阅读 · 0 评论 -
用Java手写JVM第一章——命令行工具
解析简单的参数1、现在pom.xml中导入jcommander依赖,这个库用于解析参数。 <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.72</version> </dependency>2、首先定义原创 2021-05-18 20:51:17 · 988 阅读 · 1 评论