文章目录
一:内存结构概述
1:运行时数据区
2:运行时数据区简图
3:运行时数据区详细图中英文版
二:类加载器子系统
1:加载
2:连接
3:初始化
一:内存结构概述
1:运行时数据区
class文件被称为字节码文件,从字节码文件之后都是由我们的JVM负责的了。
首先需要就是基于ClassLoader将我们的类加载到JVM当中,对应到我们的内存当中生成大的Class对象,并将静态属性进行一个初始化,当前这个操作主要是在方法区体现他的操作。
当我们真正字节码指令的时后,执行引擎就开始发挥作用了,一开始是我们的执行引擎。按照字节码指令依次是去做执行。这里边就涉及到虚拟机栈的从局部变量表中去取数据,包括还需要操作操作数栈。如果需要创建对象的话,还需要使用到我们的堆空间,在这个过程中我们的指令依次往下走的话需要用到程序计数器。如果在整个过程中需要调用本地方法的话,还需要使用本地方法栈。
以上就是运行时数据区的一个概念。
2:运行时数据区简图
3:运行时数据区详细图中英文版
二:类加载器子系统
类加载阶段涉及到三个大阶段:
1:加载
加载阶段需要用到我们的类加载器,这里共涉及到三类加载器:引导类加载器、拓展类加载器、系统类加载器(应用级加载器)。
2:连接
连接阶段又分为:验证、准备、解析阶段。
3:初始化
静态变量的显示初始化。
接下来,在整个的这个过程中我们就把Java中的类或者接口都加载进入到JVM当中了。这个时候,我们在运行时数据区里边。虚拟机栈、本地方法栈、程序计数器都是每个线程一份。
栈里边的一个又一个的结构被称之为栈帧。栈帧还有很细节的内部结构。LV代表本地变量表,OS代表操作数栈,DL代表动态链接,RA代表方法返回地址。
本地方法栈跟虚拟机栈的区别,他是专门调用native的本地方法的。
堆区是最大的一块空间。GC主要伺候的一个空间。方法区主要是存放类的信息、常量、域信息、方法信息等。方法区只有Hotspot虚拟机才有,其他的虚拟机都没有。
解释器和JIT及时编译器和我们的垃圾回收期都在我们的执行引擎中。他的作用就是将我们的指令翻译成为机器指令,供CPU去执行。
如果自己手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器和执行引擎