JVM内存区域
一.程序计数器
1.是当前线程所执行的字节码的行号指示器,字节码解释器通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理都需要依赖程序计数器来完成
2.多线程情况下,需要依赖程序计数器来记录当前线程执行的位置,从而当线程切换回来的时候知道上次线程执行到哪了
随着线程的结束而死亡
二.java虚拟机栈
描述的是java方法的执行内存模型
(实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)
Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。
也是线程私有的,也是随着线程的死亡而死亡
三.本地方法栈
和java虚拟机栈作用很相似,区别是java虚拟机栈执行的是java方法(也就是字节码)服务,而本地方法栈则为虚拟机用到的Native方法服务,
本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。
四.堆
存放对象实例的,几乎所有的对象实例以及数组都在这里分配
是线程所共享的
五.方法区
方法区也是线程共享的内存区域
用于存储已被虚拟机加载的类信息,常量,静态变量即使编译器编码后的代码等数据
java虚拟机把它当做的堆的逻辑部分,但是但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
六、运行时常量池
JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。