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)