java虚拟机运行时数据区域主要包含:
1.程序计数器
2.虚拟机栈
3.本地方法栈
4.方法区
5.堆
下图绿色部分的数据是所有线程共享的。
编辑
一、程序计数器
a、是一块较小的内存空间,是当前线程执行的字节码指示器。
b、当前线程执行的是java方法,程序计数器记录正在执行的虚拟机字节码指令地址。
c、若当前线程执行的是本地方法,程序计数器值为空。(undefined)。
d、每条线程有独立的程序计数器,互补影响,独立存储。(线程私有)
e、程序计数器不会发生OutOfMemoryError
二、虚拟机栈
每个java方法在虚拟机栈中都是一个栈帧,方法从调用到执行完毕的过程对应栈帧在虚拟机栈中入栈,出栈的过程。
编辑
a、 我们常说的栈指的就是虚拟机栈,精确一点就是指虚拟机栈中局部变量表部分。
b、局部变量表存放了基本数据类型(boolean,byte,char,short,int,float,long,double);对象引用(指向对象起始地址的指针)
虚拟机栈是线程私有的。
c、当线程请求的栈深度大于虚拟机允许的深度,抛出StackOverFlowError。
d、当虚拟机栈的深度可以动态扩展,扩展后还申请不到足够内存,抛出OutOfMemoryError。
三、本地方法栈
a、与虚拟机栈类似,只不过本地方法栈执行的是native方法。(C语言写的)
b、当线程请求的栈深度大于本地方法栈允许的深度,抛出StackOverFlowError。
c、当本地方法栈的深度可以动态扩展,扩展后还申请不到足够内存,抛出OutOfMemoryError。
四、堆
a、堆是虚拟机中内存最大的。
b、堆为所有的对象实例及数组分配内存。
c、堆中没有足够的空间为实例分配内存时,将抛出OutOfMemoryError。
五、方法区
a、存储已被虚拟机加载的类型信息,常量,静态变量,运行时常量池。
b、方法区无法满足内存分配需求时,将抛出OutOfMemoryError。