Java虚拟机架构

Java虚拟机规范中规定了虚拟机必须遵守一些规则,只要符合这些规范,其实现可以完全不同。例如有Oracle官方的Hotspot,IBM的Jikes,Google的安卓虚拟机。这些虚拟机有各自的架构,本文以Hotspot为例介绍虚拟机各个组成部分。


整体架构:

典型的虚拟机架构如下图所示:


主要组件包括:类加载子系统、含有垃圾回收的内存系统、仿真引擎(或者成为执行引擎)


各部分简介

1. 类加载子系统(Class Loaders)
类加载器把含有元数据和指令的类文件(.class,可以是存储在本地的文件,也可以来自网络的二进制流)转化为一个依赖于实现的内存映像。具体步骤大致如下:
首先将二进制类载入内存,接着执行一些一致性检查,例如魔数,版本号等等Class文件中的内容。在程序被验证为正确结构之后,解析指令并初始化内存(此内存模型符合虚拟机的具体实现),初始化之后将控制传给执行引擎。
2. 内存和状态寄存器
内存由一个程序代码区(方法区)、一个全局内存区(堆)、一个结构化的Java栈、一个本地方法栈组成。
方法区是线程共享的内存区域,用于存放类信息、常量、静态变量、即时编译后的代码等等。
堆用于存放程序创建的所有对象和数组,线程共享。这是回收期工作的主要对象。
Java栈为线程私有,存储局部变量、操作数栈、动态链接、方法出口等等。
本地方法栈则是为虚拟机调用本地方法服务的。

与内存相关的两个重要寄存器是PCs和栈指针。其中,程序计数器指向下一条要执行的指令(存放于方法区中),只能通过PCs来访问程序内存。栈指针指向Java栈的栈顶,用来访问栈中的内容。
3. 垃圾回收器(Garbage Collector)
当程序不再需要使用Java对象时,这些对象就成为了垃圾。虽然虚拟机规范中对于栈大小没有明确规定,但是实际的虚拟机实现内存都是有限的,因此必须回收垃圾以便可以重新使用内存。垃圾回收器就是负责找出不需要的对象,将其回收。
4. 执行引擎
仿真引擎有本地方法接口和寄存器支持,负责仿真Java字节码指令,可以是简单的解释器,也可以是编译器编译成主机指令。也可以将两者结合来实现高性能虚拟机,检查到热点之后翻译成本地指令保存在代码cache中。
5. 本地方法接口
虚拟机使用一组标准库来访问由操作系统管理的(operating system-managed)功能。例如,利用这些库执行文件I/O等等。这些标准可有些事用Java写的,有些则使用本地代码(如C),许多对操作系统的调用是通过本地方法来完成的。在JDK中可以找到这一些本地代码。

说明:

虚拟机的内容非常繁多而且复杂,这些文章都比较零散,等对虚拟机掌握得比较透彻之后,再总结一些比较系统的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值