1、运行时数据区域划分
2、程序计数器
作用:可以看做是当前线程所执行的字节码的行号指示器。
解释:字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令。分支,循环等 基础功能就是依赖程序计数器来完成的。
说明:由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间来完成,一个处理器同一时间 只会执行一条线程中的指令。为了线程恢复后能够恢复正确的执行位置,每条线程都需要一个 独立的程序计数器,以确保线程之间互不影响。所以程序计数器是“线程私有”的内存。
注明:程序计数器区域是Java虚拟机中唯一没有定义OutOfMemory异常的区域
3、Java虚拟机栈
作用:虚拟机栈描述的是Java方法执行的内存模型
说明:每个方法被执行的时候都会创建一个栈帧 用于存储局部变量表,操作栈,动态链接, 方法出口等信息。每一个方法被调用的过程 就对应一个栈帧在虚拟机栈中从入栈到出 栈的过程。
异常:(1) 线程请求的栈深度大于虚拟机允许的栈深度, 将抛出StackOverflowError。
(2)虚拟机栈空间可以动态扩展,当动态扩展是无 法申请到足够的空间时,抛出OutOfMemory异常。
注明:Java虚拟机栈也是线程私有的,生命周期与线程相同
4、Java本地方法栈
说明:本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的, 而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地 方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。 在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一
注明:本地方法栈中也会抛出StackOverflowError和OutOfMemory异常。
5、Java堆
作用:Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
说明:在 Java 中,堆被划分成两个不同的区域:
(1)新生代 ( Young )。 新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor
(2)老年代 ( Old )。
目的:这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 注明:各个线程共享的内存区域
6、方法区、运行时常量池、直接内存
(1)方法区也是线程共享的区域,用于存储已经被虚拟机加载的类信息,常量,静态变量
(2)运行时常量池也是方法区的一部分。
(3)直接内存并不是虚拟机运行时数据区的一部分,也不是Java迅疾规范中定义的内存区域。 注明:方法区、直接内存无法满足内存分配需求时将抛出OutOfMemoryError异常。