JVM内存模型
JVM内存模型的组成
JVM内存模型由Java栈、本地方法栈、程序计数器、方法区和堆组成,示意图如下:
其中,Java栈、本地方法栈和程序计数器是线程私有的,方法区和堆则是线程共享的。
程序计数器
每创建一个线程,JVM就会为线程分配一个私有的程序计数器,它是一块很小的区域。需要程序计数器的原因是由于Java支持多线程,所以在程序执行过程中如果需要进行线程之间的切换的话,就需要记住上一个线程执行到了哪个位置,比如,线程T1执行到了语句3,此时切换到了线程T2,T2执行完毕后又切换回T1,此时CPU需要知道该执行T1线程的哪条指令,所以程序计数器中存储的就是将要执行的指令。
Java栈(虚拟机栈)
Java栈也是线程私有的,用来存储一个又一个的栈帧,每个方法被执行的时候都会创建一个栈帧,栈帧中存储了局部变量表、操作数栈、动态链接和方法出口(方法返回地址)。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程,局部变量表是一片连续的存储空间,它存放的是方法的参数和方法中定义的局部变量。
本地方法栈
本地方法栈和Java栈的功能类似,但是服务对象不同,Java栈是为Java方法服务的,而本地方法栈则是为虚拟机执行的native方法服务的。
堆
堆是JVM中最大的一块区域,可以是内存中不连续的区域,它是所有线程共享的,大多数情况下Java中所有的对象和数组都要在堆上分配内存。
方法区
方法区也是所有线程共享的,方法区中存放类信息、常量、静态变量。方法区中还有运行时常量池,运行时常量池中存放Java运行时产生的字面量和符号引用。