background image

u2 constant_pool_count;

cp_info constant_pool[constant_pool_count-1];
u2 access_flags;

u2 this_class;
u2 super_class;

u2 interfaces_count;
u2 interfaces[interfaces_count];

u2 fields_count;
field_info fields[fields_count];

u2 methods_count;
method_info methods[methods_count];

u2 attributes_count;
attribute_info attributes[attributes_count];

}

需要详细了解的话,可以仔细阅读《 JVM Specification

》的第四章 The class File 

Format”,

这里不再详细说明。

友情提示:Class Loader 只管加载,只要符合文件结构就加载,至于说能不能运行,则

不是

它负责的,那是由 Execution Engine 负责的。
_ Execution Engine 执行引擎

执行引擎也叫做解释器(Interpreter),负责解释命令,提交操作系统执行。
_ Native Interface 本地接口

本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,
Java 诞生

的时候是 C/C++横行的时候,要想立足,必须有一个聪明的、睿智的调用 C/C++程序,

于是就在内

存中专门开辟了一块区域处理标记为 native 的代码,它的具体做法是 Native Method 
Stack 中登

记 native 方法,在 Execution Engine 执行时加载 native libraies。目前该方法使用的

是越来越

少了,除非是与硬件有关的应用,比如通过 Java 程序驱动打印机,或者 Java 系统管理

生产设备,

在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用
Socket 通信,

也可以使用 Web Service 等等,不多做介绍。
_ Runtime data area 运行数据区

运行数据区是整个 JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行 ,
Java

生态系统如此的繁荣,得益于该区域的优良自治,下一章节详细介绍之。
整个 JVM 框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互

是可以
慢慢琢磨 JVM

通过本地接口进行,瞧,一个完整的系统诞生了!
2 JVM 的内存管理

所有的数据和程序都是在运行数据区存放,它包括以下几部分:
_ Stack 栈

栈也叫栈内存,是 Java 程序的运行区,是在线程创建时创建,它的生命期是跟随线程的

生命

期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该
栈就 Over。

问题出来了:栈中存的是那些数据呢?又什么是格式呢?
栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数

据集,是
一个有关方法(Method)和运行期数据的数据集,当一个方法 A 被调用时就产生了一个栈

帧 F1,并