简述JVM内存组成

it2025-09-08  7

JVM内存按能不能线程共享分为共享区和私有区。 共享区包括堆和方法区。私有区包括程序计数器、虚拟机栈、本地方法栈。 私有区可以称之为是线程隔离的,而共享区不是线程隔离的。

堆: 堆中主要存储程序运行时加载的实例对象。(准确的说,是类加载器classLoader加载所需类的字节码文件)。 堆中的数据也是垃圾回收的重点区域,同时也是JVM内存中最大的一块区域。

方法区: 方法区存储的内容包括类信息、常量、静态变量及域信息(Field)和方法信息(Method)。 其中,类信息是由类加载器在加载类的时候从类文件中提取出来的,包括以下几点:

类的完整有效名这个类的直接父类的完整有效名类的修饰符这个类的直接接口的一个有序列表 常量存储在方区中的常量池中。 静态变量是指的除了常量(常量也有static修饰符)以外的静态变量。

注意:对于方法区JVM回收的比较少,而且一般回收的是常量和类卸载的信息。 对于静态变量,是不进行回收的。 (如果定义的静态变量是一个引用类型的话,是有可能被回收的。)

程序计数器: 程序计数器是当前线程所执行字节码指令的行号指示器,如分支、跳转、循环、异常处理、线程回复等都需要依赖线程计数器来实现。 对于线程计数器来说,最典型的应用是,在进行分支跳转的时候,用程序计数器记录行号。

虚拟机栈: 与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机描述的是Java方法执行的内存模型。 每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机栈中入栈到出栈的过程。

本地方法栈: 本地方法栈和虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈是非虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机执行Native方法服务的。

欢迎各位批评指正。

最新回复(0)