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文件结构开始来了解方法区的布局,并创建它的数据结构

jvm

相关推荐