虚拟机结构:
2.Program Counter Register
类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined
3.Java Stack
虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。
如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。
4.method Frame
栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(FrameData)。
本地方法栈
与虚拟机栈类似,只是是执行本地方法时使用的
6.Method Area
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。
方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。
7.Heap
堆
虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。
如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。
新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)
9.简述JVM
JVM:
-----------------
1.JVM: java virtual machine.
2.class file
*.class
3.ClassLoader
4.runtime data area
运行时数据区。
1.Method area : 方法区.(shared)
供所有线程共享.
2.heap(shared):
供所有线程共享.
3.java stack(栈区)
独占的。
4.native method stack(本地方法栈)
独占
5.Program counter register
程序计数器.
5.execute engine
执行引擎。
6.native interface
本地接口
7.native libraries
本地类库