JVM虚拟机将其管理的内存划分为若干个不同的数据区域,Java虚拟机规范将 JVM所管理的内存划分如下图
线程共享区:
堆、方法区
线程私有区:
虚拟机栈、本地方法栈、程序计数器
详细讲解
堆
几乎所有的对象实例和数组都在堆上,是垃圾收集器管理的主要区域。
方法区
用于存储被虚拟机加载的类的信息(名称、修饰符等)、常量、静态变量、类的属性、类的方法。其实就是提供类的静态描述,这个类或类型对象有什么。需要注意的是运行时常量池也在方法区中。
本地方法栈
该区域与虚拟机栈作用类似,只是虚拟机栈为 Java 方法服务,本地方法栈为使用到的操作系统方法服务
程序计数器
一块较小的内存空间,指示下一步要执行的指令序列
虚拟机栈
描述 Java 方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧,栈帧用于存储局部变量表、操作树栈、动态链接、方法返回地址和一些额外信息。
下面是栈帧存放信息的简单说明,操作数栈在此不解释1.局部变量表
局部变量表是一组变量值的存储空间,存放方法参数和方法内部定义的局部变量
2.动态链接
每个栈帧内部都包含一个指向运行是常量池的引用,持有这个引用是为了支持方法调用过程中的动态链接。在Class文件中,描述一个方法调用其它方法,或访问其它成员变量是通过符号引用来表示的,动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。符号引用一部分会在类加载阶段或第一次引用时转换为直接引用(如final、static 等),称为静态解析,另一部分在每一次运行期间转换为直接引用,这部分称为动态链接。
3.方法返回地址
上层方法的 pc 值