Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的内存区域。包括以下部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区
1.程序计数器:通过改变程序计数器的值选择下一条需要执行的字节码指令。Java中每个线程都有一条独立的程序计数器。(线程私有)
2.Java虚拟机栈(VM Stack ,线程私有):描述的是Java方法执行的内存模型,每个Java方法在执行时都会创建一个桢栈(用于存储局部变量表,操作数栈,动态链接,方法出入口等信息)。每个方法从调用到执行完成的过程,就对应着一个栈帧从Java虚拟机栈从入栈到出栈的过程。
异常:
StackOverflowError:线程请求的栈深度大于虚拟机所允许的栈深度。
OutOfMemoryError:如果虚拟机栈可以动态扩展,扩展时无法申请到足够的内存。
3.本地方法栈(Native Method Stack):为VM使用的Native方法服务。(虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机使用到的Native方法服务)
异常:
StackOverflowError
OutOfMemoryError
4.Java堆:被所有线程共享的一块区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例。
Java堆是内存收集器管理的主要区域,很多时候也被称为“GC堆”。
Java堆可以处于物理上不连续的内存区域,只要逻辑上是连续的即可。
异常:
OutOfMemoryError:堆中没有内存完成实例分配,并且堆也无法在扩展。
5.方法区:各个线程共享的内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
异常:
OutOfMemoryError:方法区无法满足内存分配需求时。

收藏 打印