运行时数据区域
线程共享区域:堆,方法区,运行时常量池
线程私有区域:程序计数器,Java虚拟机栈,本地方法栈
程序计数器:
程序计数器:内存空间比较小,可以看作当前线程所执行的字节码的行号指令集
若当前线程正在执行的是一个Java方法,这个计数器记录的时正在执行的虚拟机字节码指令的地址
若执行的是一个Native方法,这个计数器值为空
程序计数器是线程私有的,每条线程都有其独立的程序计数器,
Java虚拟机栈:
Java虚拟机描述的是一个Java方法执行的内存模型,
每一个方法执行时都会创建一个栈帧用于存储局部变量表(8大基本数据类型,对象的引用),操作数栈,动态链接,方法出口等
每一个方法从调用到执行完成,都对应一个栈帧在虚拟机中入栈和出栈的过程
生命周期与线程相同
此区域会出现两种异常:StackOverflowError 、OutOfMemoryError(OOM)
本地方法栈:
本地方法栈和Java虚拟机栈的作用完全相同,Java虚拟机栈为JVM执行的Java方法服务,本地方法栈为JVM所用的Native方法服务
在HotSpot虚拟机中,Java虚拟机栈和本地方法栈在同一块内存区域
Java堆:
是Java虚拟机管理的最大的内存区域,Java堆在JVM启动时创建,存放了数组、对象实例,是垃圾回收管理的主要区域
可以处于物理上不连续的空间中,Java虚拟机在主流的虚拟机中都是可以扩展的
若堆中无法完成对象的实例或堆无法拓展时,会出现OOM
方法区:
用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译器编译后的代码等
在JDK8以前的HotSpot虚拟机中,方法区也被称为“永久代”(JDK8被元空间取代)
当方法区无法满足内存分配需求时,会出现OOM
运行时常量池:
运行时常量池是方法区的一部分,存放字面量(字符串(JDK1.7后移到堆中),final常量,基本数据类型)
符号引用(类和结构的完全限定名,字段的名称和描述符,方法的名称和描述符)