java-基础-虚拟机jvm

来源:互联网 发布:c语言初学者百题大战 编辑:程序博客网 时间:2024/06/06 02:59

虚拟机结构:



2.Program CounterRegister

程序计算器
类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined

3.Java Stack

Ø虚拟机栈
虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。

如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。

4.method Frame

Ø方法帧
栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(FrameData)。

5.Native Method Stack

本地方法
与虚拟机栈类似,只是是执行本地方法时使用的

6.Method Area

Ø方法区
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。

方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。

7.Heap


虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)

如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代

新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation BufferTLAB

Java堆只要求逻辑上是连续的,在物理空间上可以不连续。

8.直接内存

ØJDK1.4中引用了NIO,并引用了Channel与Buffer,可以使用Native函数库直接分配堆外内存,并通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

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
本地类库






0 0
原创粉丝点击