JVM(Java虚拟机)内存模型

JVM内存模型是Java程序在运行时使用的内存结构。JVM将程序所需的内存空间划分为以下几个不同的区域:

  • 堆内存(Heap Memory):

    所有类实例和数组都在堆上创建,堆是JVM中最大的一块内存区域,用于存储对象实例。

  • 方法区(Method Area):

    用于存储已加载的类信息、常量、静态变量等。

  • 栈内存(Stack Memory):

    每个线程都有一个独立的栈空间,用于存储方法调用时的局部变量、方法参数等。

  • 本地方法栈(Native Method Stack):

    与虚拟机栈类似,但是它是为本地方法服务的。

  • 程序计数器(Program Counter Register):

    用于存储指向下一条指令的地址,以支持线程间的切换和恢复。

线程空间

线程空间是指每个线程在运行时使用的内存空间。线程空间包含JVM栈本地方法栈程序计数器。每个线程都有自己的JVM栈本地方法栈,但所有线程共享方法区堆内存

JVM根据需要动态分配堆内存空间,当对象不再被引用时,由垃圾收集器负责回收堆内存。JVM栈和本地方法栈的大小在程序运行前确定,并且在运行时不能动态调整。

  • JVM栈

    线程空间的JVM栈用于存储方法调用时的局部变量、方法参数等,每个方法调用都会在JVM栈上创建一个新的栈帧(Stack Frame),栈帧包含了该方法的信息,包括方法的参数、返回值、局部变量等。当方法调用结束时,其对应的栈帧将从JVM栈中弹出。

  • 本地方法栈

    线程空间的本地方法栈用于支持Java程序调用本地方法,本地方法是使用本地语言编写的代码,如C或C++。JVM执行本地方法时,将其压入本地方法栈中,然后调用本地语言的函数。当本地方法返回时,JVM将其从本地方法栈中弹出。

  • 程序计数器

    线程空间的程序计数器用于记录JVM正在执行的字节码指令地址,以便在线程切换后能够恢复执行。由于每个线程都有自己的程序计数器,因此可以同时执行多个线程,而不会相互干扰。