1、虚拟机内存模型数组
一、线程私有的数据区线程
线程私有的数据区包括程序计数器、虚拟机栈和本地方法栈三个区域,对象
a.程序计数器blog
当线程数超过CPU数量或CPU内核数量时,线程之间就要根据时间片就要根据时间片轮询抢夺cpu时间资源,所以 为了线程切换后能恢复到正确执行位置,每条线程都须要独立的计数器去记录其正在执行的字节码指令地址。程序计数器是线程私有的一块较小的内存空间,其能够看作是当前线程所执行的字节码的行号指示器,若是线程正在执行的是Java方法,计数器记录的是正在执行的字节码指令的地址;若是正在执行的是Native方法,则计数器的值为空。程序计数器是惟一一个没有规定任何OutOfMenoryError的区域接口
b.虚拟机栈内存
拟机栈的描述的是Java方法执行的内存模型,是线程私有的。每一个方法在执行的时候都会建立一个栈桢,用于存储局部变量表,操做数栈,动态连接,方法出口等信息,并且每一个方法从调用到直至完成的过程,对应一个栈桢在虚拟机栈中入栈出栈的过程,其中,局部变量表主要存放一些基本类型的变量,和对象句柄,它们可使方法参数,也能够是方法的局部变量。虚拟机栈有两种异常状况:StackOverflowError和OutofMemoryError,资源
c.本地方法栈编译器
本地方法栈与Java虚拟机栈很是类似,也是线程私有的,区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机执行的Native方法服务(一个Native Method就是一个Java调用非Java代码的接口,一个Native Method是这样一个Java的方法:该方法的实现是由非Java语言实现的,例如 c虚拟机
2、线程共享的数据区编译
线程共享的数据区具体包括Java堆和方法区两个区域,
a、Java堆
Java堆的惟一目的就是存放对象实例,几乎全部的对象实例(和数组)都在这里分配内存。Java堆是线程共享的,类对象从中分配空间,这些对象经过new、newarray、anewarray和multianewarray等指令创建,它们不须要程序代码来显示的释放。Java堆的目的就是用来存放对象实例的,所以其也是垃圾收集器管理的主要区域,故也称为GC堆。
b、方法区
方法区和Java堆同样,也是线程共享的而且不须要连续的内存,其用于存储已被虚拟机加载的类信息,常量、静态变量、即时编译器编译后的代码等数据。
(1)、运行时常量池,
运行时常量池是方法区的一部分,用于存放编译期生成的各类字面量和符号引用。类和接口的全限定名、字段的名称和描述符和方法的名称和描述符。