• JVM 内存模型


    1 什么是 JVM 内存模型

    JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内

    存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。

    2 JVM 为什么进行内存区域划分

    随着对象数量的增加,JVM 内存使用率也在增加,如果 JVM 内存使用率达到 100%,

    则无法继续运行程序。为了让 JVM 内存可以被重复使用,我们需要进行垃圾回收。为了提

    高垃圾回收的效率,JVM 将内存区域进行了划分

    3 JVM 内存划分

    JVM 按照线程是否共享将内存首先分成两大类

    线程独享区

    只有当前线程能访问数据的区域,线程之间不能共享

    线程独享区随线程的创建而创建,随线程的销毁而被回收

    线程共享区

    所有线程都可以访问的区域,

    当线程被销毁的时候,共享区的数据不会立即回收,需要等待达到垃圾回收的阈(yu)

    值之后才会进行回收。

    在这里插入图片描述

    在这里插入图片描述

    4 程序计数器

    程序计数器会记录当前线程要执行指令的内存地址,只占用一小部分内存区域,只记录一个

    地址,所以我们认为程序计数器是不会出现内存溢出问题的分区

    5 本地方法栈

    Java 中有些代码的实现是依赖于其他非 Java 语言的(C++),本地方法栈存储的是维护

    非 Java 语句执行过程中产生的数据,一般我们认为本地方法栈不会出现内存的问题。

    6 虚拟机栈

    6.1 虚拟机栈的作用

    存放当前线程中所声明的变量,包括基本数据类型的数据和引用数据类型的引用。

    基本数据类型和引用数据类型划分的标准:

    基本数据类型:

    变量在声明的时候,能够确认占用内存的大小。

    引用数据类型:

    变量在声明的时候,不能确认占用内存的大小。

    引用数据类型将值的引用存放到虚拟机栈中,而对象存放在堆内存中,引用数据类型占用 4

    个字节存放地址

    6.2 栈帧

    每一个线程都会对应一个虚拟机栈,线程中的每个方法都会创建一个栈帧,存放本次方法执

    行过程中所需要的所有数据。

    如果我们一个线程中有多个方法的嵌套调用,虚拟机栈会对栈帧进行压栈和出栈操作。正在

    执行的方法一定在栈顶,我们只能获取栈顶的栈帧,栈帧在虚拟机栈中先进后出。

    在这里插入图片描述

    6.3 栈帧的数据结构

    局部变量

    存放当前方法的局部变量,基本数据类型存值,引用数据类型存堆内存地址。

    操作数栈

    对方法中的变量提供计算的区域。

    常量数据的引用

    常量数据会存放到方法区的常量池中,不管是基本数据类型还是引用数据类型都会存放常量

    池的地址

    方法返回值的地址

    方法返回数据会存到计算机内存的寄存器中。

    在这里插入图片描述

    6.4 虚拟机栈溢出异常

    由于栈帧调用的深度太深,会出现虚拟机栈溢出异常(SOF 异常)。一般手动方法的调用

    是不会出现这个异常的,如果出现这个异常 ,99%是由于递归。

    可以通过修改虚拟机栈的内存大小设置栈帧的最大深度,指令为:-Xss 虚拟机栈内存大小 。

    没设置-Xss虚拟机参数前,递归到7000多次就溢出报异常在这里插入图片描述

    在这里插入图片描述

    设置-Xss参数调大后10000多次递归次数才溢出报异常在这里插入图片描述

    一般栈帧深度达到 3000~5000 即可

    太小:虚拟机栈容易溢出。

    太大:每个线程占据的内存过大,影响线程数量。

    7 方法区

    在 java8 之后,我们把方法区称之为元空间(MetaSpace),方法区在逻辑上属于堆

    的一部分,但一些具体机制和堆有所区别,如:一些 JVM 的方法区是可以不进行垃圾回收

    的,关闭 JVM 时才会释放方法区内存。所以方法区还有一个别名叫非堆,目的是和堆分开。

    方法区会存储类信息、静态变量、常量(JDK8 之后不存放字符串常量)、本地机器指 令。

    如果加载大量 class 文件,也会造成方法区内存溢出,如一个 tomcat 运行 20~30 个 项目。

  • 相关阅读:
    计算机组成原理 | 总线
    数据机构----线性表之单向链表
    Excel数据丢失怎么找回?详细恢复教程分享!
    【广州华锐互动】利用VR开展细胞基础实验教学有什么好处?
    7.8 显示管理
    【算法康复训练③】剑指offer P3
    VSCode查询包中的内容设置
    助力古彝文保护,AI文字识别技术推动文化传承
    【前端】特效开发
    HuggingFace Transformers教程(1)--使用AutoClass加载预训练实例
  • 原文地址:https://blog.csdn.net/m0_52789121/article/details/126409902