Java虚拟机所管理的内存包含程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区5个部分。模型图如下图所示:
1、程序计数器:
为了线程切换后能恢复到正确的执行顺序,每个线程都需要一个独立的程序计数器,各个线程之间的计数器互不影响。
独立存储,这类内存区域为【线程私有】的内存。
程序计数器具有如下的特点:
- 是一块较小的内存空间。
- 线程私有,每条线程都有自己的程序计数器。
- 生命周期方面,随着线程的创建而创建,随着线程的结束而销毁。
- 是唯一一个不会出现OutOfMemoryError的内存区域。
程序计数器的作用:
保证执行顺序,为了线程切换后能恢复到正确的执行位置。主要应用于多线程场景。
在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。
2、Java虚拟机栈:
Java虚拟机栈也是线程私有的,它的生命周期与线程的生命周期同步,虚拟机栈描述的是Java方法执行的线程内存模型。
Java虚拟机栈有如下的特点:
- 局部变量表所需的内存空间在编译期间完成分配,进入一个方法时,这个方法需要在栈桢中分配的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。
- Java虚拟机栈会出现两种异常:StackOverflowError和OutOfMemoryError。
3、本地方法栈:
本地方法栈与虚拟机栈所发挥的作用很类似,区别在于虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的本地方法服务。
4、Java堆:
Java堆是虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
此内存区域的唯一目的就是存放对象实例。
5、方法区:
方法区和Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。