JVM运行时数据区

30 阅读1分钟

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。