目录
JAVA虚拟机栈(私有)
本地方法栈
程序计数器
JAVA堆
方法区(非堆)
运行时常量池
直接内存(不属于虚拟机运行时数据区的一部分,但很重要)
话不多说上图
JAVA虚拟机栈(私有)
线程私有,生命周期与线程相同。
虚拟机栈描述的是方法执行的线程内存模型:每个方法被调用的时候,都会创建一个栈帧(储存局部变量,操作数帧,动态连接,方法出口等信息)压入栈,直到方法被调用完成,出栈。
局部变量表存放了编译期可知的各种 Java 虚拟机基本数据类型(boolean、 byte 、 char 、 short 、 int 、 float、 long 、 double )、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置returnAddress 类型(指向了一条字节码指令的地址)。
本地方法栈
本地方法栈( Native Method Stacks )与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机
栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地 方法服务。 《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规 定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如Hot-Spot虚拟机)直接 就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError 和 OutOfMemoryError 异常。
程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的 字节码的行号指示器。在Java 虚拟机的概念模型里 ,字节码解释器工作时就是通过改变这个计数器 的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。(简单来说就是看要执行那一条指令)
JAVA堆
对于java程序来说,堆是占用空间内存比例最大的一块。是所有线程共享的一块区域,几乎多有的对象实例都在这。
堆也是垃圾收集器管理的区域,我们经常听到的老年代,新生代,Eden空间等等都在这,除了线程共享,也可以划分出线程私有的区域
方法区(非堆)
与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
在JDK8以前方法区是利用永久代实现的。后来在本地内存中用与元空间实现。
运行时常量池
运行时常量池是方法区的一部分,存类文件中的常量,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
直接内存(不属于虚拟机运行时数据区的一部分,但很重要)
直接内存( Direct Memory )并不是虚拟机运行时数据区的一部分,也不是《
Java 虚拟机规范》中 定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现,