Java虚拟机(JVM)内存模型是JVM管理和执行Java程序所使用的内存布局。它定义了不同类型的数据应该存储在内存的哪个部分,以及这些数据如何、何时从一个地方移动到另一个地方。JVM内存模型的主要组成部分包括:
- 堆(Heap)
- 堆是JVM内存模型中最大的一块,也是所有线程共享的内存区域。
- 它用于存储对象实例和数组。
- 堆内存分为新生代(Young Generation)、老年代(Old Generation)和(在某些垃圾收集器中的)永久代(Permanent Generation,但在Java 8中已被元空间Metaspace替代)。
- 垃圾收集器主要在堆上进行工作,回收不再使用的对象所占用的内存。
- 方法区(Method Area)
- 方法区(在Java 8中,对应的是元空间Metaspace)是所有线程共享的内存区域。
- 它用于存储已被虚拟机加载的类信息、常量、静态变量等数据。
- 由于存储的是全局共享的元数据,方法区的数据通常不会被频繁地回收。
- 程序计数器(Program Counter Register)
- 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
- 每个线程都有自己的程序计数器,是线程私有的内存。
- 程序计数器的作用是记录当前线程执行到哪一条指令。
- 虚拟机栈(Java Virtual Machine Stack)
- 虚拟机栈也是线程私有的,它的生命周期与线程相同。
- 每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
- 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
- 本地方法栈(Native Method Stack)
- 本地方法栈与虚拟机栈类似,但它服务于Java的Native方法。
- 它也是线程私有的,用于支持Native方法的执行。
附上流程图链接:https://www.processon.com/view/link/610575095653bb32a581281f