一、JVM 内存结构

Java 虚拟机规范中定义了 Java 虚拟机内存的结构,Java 虚拟机内存结构由堆 (Heap)、栈 (Stack)、方法区 (Method Area)、运行时常量池 (Runtime Constant Pool)、本地方法栈 (Native Method Stack)、程序计数器 (Program Counter Register) 等组成,其中堆和栈是所有线程共享的,而其他几个则是线程私有的。

二、堆

堆是 Java 虚拟机所管理的内存中最大的一块,也是所有线程共享的一块内存区域,它是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java 堆是垃圾收集器管理的主要区域,因此也被称为 GC 堆。

三、栈

栈也是 Java 虚拟机管理的内存之一,它与堆一样也是被所有线程共享的内存区域,它用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接和方法出口等信息,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

四、方法区

方法区是 Java 虚拟机管理的另外一块内存区域,它与堆和栈一样也是被所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

五、运行时常量池

运行时常量池是方法区的一部分,它用于存放编译期生成的各种字面量和符号引用,这些数据都是在类加载后从方法区中提取出来放入运行时常量池中的。

六、本地方法栈

本地方法栈与虚拟机栈所发挥的作用非常类似,它也是用于存储局部变量表、操作栈、动态链接和方法出口等信息的,不同的是虚拟机栈主要用于存放 Java 方法的局部变量表信息,而本地方法栈主要用于存放 Native 方法的信息。

七、程序计数器

程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。