JVM

杂谈 发表评论

http://blog.csdn.net/moneyshi/article/details/53086927

http://blog.csdn.net/moneyshi/article/details/53033577

文章内容参考《自己动手写java虚拟机》

1.java虚拟机通过类路径来找到类,类路径分为

启动类路径                jre\lib下,java标准库(大部分在rt.jar)在这里

扩展类路径              D:\Java\jre1.8.0_92\lib\ext

用户类路径

Entry接口,定义这个接口表示类路径,这个是父接口,下面还有4个子接口

Entry interface{

readClass(className String)

String string

}

2.运行时数据区,分为2大块————- 一类是多线程共享的(需要在JVM启动时创建好,退出时被销毁),另一类是线程私有的(创建线程时才创建,线程退出时销毁)。

线程私有的运行时数据区包括:

PC寄存器

java虚拟机栈(栈帧,栈帧又包含局部变量表和操作数栈)

type  Thread   struct{                                  type     Stack    struct{                                                           

       pc   int ;                                                           maxSize      unit ; (保存栈的容量,也就是最多可以容纳多少帧)

       stack   *stack ;                                              size              unit ;  (保存栈的当前大小)

}                                                                              _top             *Frame;   (保存栈顶指针)}

                                                                         

type    Frame   struct{                                                                                              func    NewFrame(maxLocals,maxStack   unit)    *Frame{

    lower    *Frame; (用来实现链表数据结构)                                                                return  &Frame{

    localVars     localVars ;(保存局部变量表指针)                                                              localVars:  newLocalVars(maxLocals);

    operandStack   *operandStack; (保存操作数栈指针)                                                 operandStack : newOperandStack(maxStack);(操作数栈)

}                                                                                                                                         }   }

当有一个方法被调用时,代表这个方法的栈帧入栈,当这个方法返回时,其栈帧出栈。栈帧的入栈顺序就是方法的调用顺序。

局部变量表使用索引进行访问,所以它应该是一个数组

type   slot   struct{                                      func   newLocalVars(maxLocals unit)  LocalVars{

num   int32 ;                                                   if   maxLocals >0{

       ref    *Object ;                                                            return  make([] slot, maxLocals)}

type OperandStack   struct{                     func   newOperandStack(maxStack unit)  *OperandStack{

  size   unit ;                                                     if  maxStack >0

       slote  [] slot;                                                                   return   &OperandStack

}                                                                                                        slot:make( [] slot,maxStack)

上一篇:
下一篇:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *