Java虚拟机的研究与实现
http://tech.ddvip.com 2006年11月20日 社区交流
本文详细介绍Java虚拟机的研究与实现
在及时编译过程中要经常使用到操作数栈,虚拟机把操作数栈作为它的工作区。大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。而操作数栈区,局部变量区和帧数据区被包含在方法帧中。方法帧的数据结构如下:
typedef struct Frame{
struct Frame *prev; // 上一帧
struct Frame *next; // 下一帧
value_t *sp; // 栈槽指针
uint8 *pc; // 程序计数器
method_t *method; //指向正在被执行的方法
class_t *class_ptr; // 指向包含该方法的类
value_t locals[1]; //方法的局部变量的起始
}Frame;本实现中的及时编译器的优点表现在:(1)大大提高了Java应用程序运行的速度;(2)编译过程只在运行时进行,不会改动Java字节码,不会影响Java程序的可移植性;(3)对字节码的编译,使得许多优化手段的采用成为可能。缺点表现在:(1)如果对所有方法进行编译,则会占用大量的内存空间;(2)及时编译的结果在虚拟机终止运行时不被保存,这意味着下一次运行同样的程序仍需要重复编译。
3、垃圾收集
垃圾收集器主要的任务是检测出垃圾对象,然后回收垃圾对象使用的堆空间并还给程序。kaffe采用了增量垃圾收集的算法,而本实现中采用了三色标记并清除算法。
在标记之前先将堆中所有的分配单元置成白色,然后按深度优先算法遍历每一个单元。当垃圾收集器遍历一个分支的时候,如果一个分配单元及与之相关联的单元都被遍历到,则将其标记成黑色。 如果一个单元被遍历到,但是与之相关联的单元尚未被遍历,则将该单元标记成灰色。这时,垃圾收集器将继续遍历与该灰色单元相关联的单元,直到这些相关联的单元全部被遍历到,才能将这个灰色单元标记成黑色。最后当所有被遍历到的单元都被标记成黑色的时候, 将堆中被标记成白色的分配单元回收。
来源:计算机与信息技术 作者:夏兵 俞建军 责编:豆豆技术应用
正在加载评论...