JVM初学一
在水木上看到了一则关于撒加的文章,于是看了看它关于JVM的介绍,并开始收集了关于JVM的资料,并开始查看JVMspec.网上有中文和英文两个版本
书中从第三章开始步入正题介绍了关于JVM的基本概念,CLASS文件的结构,常量池及其解析。并在后面介绍了JVM的基本指令集,一般JAVA源码的编译和一些优化。其中最重要的还是前面的基本概念,这里是看懂JVM指令代码的基础。因为是Spec,所以它的宗旨是介绍Class文件格式及其其中的含义,并为JVM提供解析Class文件并运行它提供一个准则。也就是说,Class文件也可以由其他语言例如C语言实现。只要Class文件满足Spec,并通过JVM的链接过程。
JVM运行是基于以下数据的:
1运行期数据,包括:PC寄存器,Java栈,堆,方法区。
APC寄存器
和普通汇编指令中的没有什么区别
BJava栈
每个线程拥有一个栈,这点和以前的常识一样。它的作用主要存储JVM框架,其实就是栈帧。栈帧包括:局部变量表,操作数栈及一些其他引用信息。这些引用信息包括方法和类实例的引用。运行期间会利用这些信息进行一些连接操作。
CJava堆
所有线程共享此存储区。用于运行期间newobject或者newarray,交由GC进行回收。
D方法区
这部分也是所有线程共享的,GC也可以进行回收它。可以将它理解为汇编代码中的正文段,它包含:常数池,域,方法数据,方法,构造函数以及<init><clinit>代码。
a常数池
相当于Symbol表,对应于class文件中的constant_pool
b自身方法栈
这个是为Native方法服务的,可以设置它的大小。
c方法,构造行数及<init><clinit>代码
就是执行代码,对应于class文件中的methods
d域
对应于class文件中fields
e接口
对应于class文件中interfaces
在class文件加载的时候建立方法区,当进行方法调用的时候会操作Java栈,并有可能因为创建实例或数组操作Java堆。我们可以先从Class文件结构开始来了解方法区的布局,并创建它的数据结构