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正在执行的字节码指令地址,以便在线程切换后能够恢复执行。由于每个线程都有自己的程序计数器,因此可以同时执行多个线程,而不会相互干扰。