java内存分区:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区。
-
程序计数器:线程私有的,存储下一条字节码指令的行号计数器。字节码解释器工作时改变程序计数器来选择下一条要执行的字节码指令。
-
java虚拟机栈:线程私有的,描述的是java方法执行时的内存模型。在java方法执行时会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态连接、方法返回值等。在java代码编译时,栈帧需要的内存大小已经确定,并且被写入方法表的code属性中。
-
局部变量表:存储方法参数和方法内部局部变量。以变量槽(slot)为单位存储,一个变量槽可以存储一个32位以内的数据类型:boolean、byte、char、short、int、float、reference和returnAddress,对于64位数据类型,则用连续2个变量槽以高位在前进行存储。当执行实例方法时,局部变量表的第0位索引的变量槽默认用于传递方法所属对象实例的引用。
-
操作数栈:
-
动态连接:
-
方法返回值:
-
-
本地方法栈:与虚拟机栈相似,java虚拟机栈为java方法服务,而本地方法栈位native方法服务。
-
方法区:线程共享的,存储已位类加载器加载的类信息、常量、静态变量等。
-
java堆:线程共享的,存储对象实例和数组,是垃圾回收器管理的主要区域。