问: 说一下 JVM 运行时数据区? 或:说一下JVM内存模型?

思路: 给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈 溢出等。 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区 域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依 赖线程的启动和结束而建立和销毁。 Java 虚拟机所管理的内存被划分为如下几个区域:

image-20240711101059717

程序计数器(Program Counter Register):

​ 当前线程所执行的字节码的行号指示器,字节码解 析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳 转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;.

Java 虚拟机栈(Java Virtual Machine Stacks):

​ 用于存储局部变量表、操作数栈、动态链接、方法出口等信息; 本地方法栈(Native Method Stack):

​ 与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;

Java 堆(Java Heap):

​ Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存; 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的 代码等数据。

JVM内存连环炮,问:JVM内存包括哪些? JVM总内存= 栈 + 堆 +Native Native= 堆外内存(直接内存) + 元空间 非堆 = 元空间

JVM8结构

image-20240711105347809

程序计数器(Program Counter Register)

程序计数器就是当前线程所执行的字节码的行号指示器,通过改变计数器的值,来选取下一行指令,通 过他来实现跳转、循环、恢复线程等功能。 在任何时刻,一个处理器内核只能运行一个线程,多线程是通过线程轮流切换,分配时间来完成 的,这就需要有一个标志来记住每个线程执行到了哪里,这里便需要到了程序计数器。 程序计数器是线程私有的,每个线程都已自己的程序计数器。

虚拟机栈(JVM Stacks)

虚拟机栈是线程私有的,随线程生灭。虚拟机栈描述的是线程中的方法的内存模型: 每个方法被执行的时候,都会在虚拟机栈中同步创建一个栈帧(stack frame)。 每个栈帧的包含如下的内容 局部变量表: 局部变量表中存储着方法里的java基本数据类型 (byte/boolean/char/int/long/double/float/short)以及对象的引用(注:这里的基本数据类型 指的是方法内的局部变量) 操作数栈 动态连接 方法返回地址 方法被执行时入栈,执行完后出栈 虚拟机栈可能会抛出两种异常: 如果线程请求的栈深度大于虚拟机所规定的栈深度,则会抛出StackOverFlowError即栈溢出 如果虚拟机的栈容量可以动态扩展,那么当虚拟机栈申请不到内存时会抛出OutOfMemoryError 即OOM内存溢出 产生StackOverFlowError的原因是: 无限递归循环调用(最常见)。 执行了大量方法,导致线程栈空间耗尽。 方法内声明了海量的局部变量。

本地方法栈(Native Method Stacks)

本地方法栈与虚拟机栈的作用是相似的,都会抛出OutOfMemoryError和StackOverFlowError,都是线 程私有的,主要的区别在于: 虚拟机栈执行的是java方法 本地方法栈执行的是native方法

Java堆(Java Heap)

java堆是JVM内存中最大的一块,由所有线程共享, 是由垃圾收集器管理的内存区域,主要存放对象实 例,当然由于java虚拟机的发展,堆中也多了许多东西,现在主要有: 对象实例 类初始化生成的对象 基本数据类型的数组也是对象实例 字符串常量池 字符串常量池原本存放于方法区,从jdk7开始放置于堆中。 字符串常量池存储的是string对象的直接引用,而不是直接存放的对象,是一张string table 静态变量 静态变量是有static修饰的变量,jdk7时从方法区迁移至堆中 线程分配缓冲区(Thread Local Allocation Buffer) 线程私有,但是不影响java堆的共性 增加线程分配缓冲区是为了提升对象分配时的效率 java堆既可以是固定大小的,也可以是可扩展的(通过参数-Xmx和-Xms设定),如果堆无法扩展或者 无法分配内存时也会报OOM。

image-20240711105649952

image-20240711105711145

image-20240711105739143

image-20240711105753767

image-20240711105816673

image-20240711105902748

image-20240711105937791