【JVM】运行时数据区(内存区域划分)详解

news2025/1/13 11:57:52

文章目录

  • 前言
  • 一、JVM 运行时数据区
    • 1, 堆
    • 2, Java 虚拟机栈
    • 3, 本地方法栈
    • 4, 程序计数器
    • 5, 元数据区 / 方法区
  • 二、内存异常问题
    • 1, 栈溢出
    • 2, 内存溢出
    • 3, 内存泄露
  • 总结


前言

📕各位读者好, 我是小陈, 这是我的个人主页
📗小陈还在持续努力学习编程, 努力通过博客输出所学知识
📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽
📙 希望我的专栏能够帮助到你:
JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、JVM 运行时数据区

又叫做 JVM 内存布局, 内存区域划分, 注意, 不等同于JVM内存模型(JMM)

JVM 内存区域划分为五个部分:

在这里插入图片描述
栈(本地方法栈+虚拟机栈) 和 程序计数器是线程私有的, 每个线程都有自己的栈和程序计数器, 而堆和元数据区是 Java 进程中所有线程共享的区域


1, 堆

Java 代码中 new 出来的类对象(包括成员属性) 都存放在堆区

堆区的空间一般比栈区大

堆区分为新生代和老年代两个部分, 新 new 出来的对象放在新生代, 经历过几次GC 还没被清除的对象存在老年代

JDK 8 中将字符串常量池移动到了堆中


2, Java 虚拟机栈

Java 虚拟机栈的生命周期和线程相同,Java 虚拟机栈描述的是 Java 方法执行的
内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈

  • 局部变量表: 存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。
  • 操作栈:每个方法会生成一个先进后出的操作栈
  • 动态链接:指向运行时常量池的方法引用
  • 方法返回地址:PC 寄存器的地址

简单来说就是栈存放了方法参数和局部变量

3, 本地方法栈

Java 虚拟机栈是给咱们编写的 Java 代码使用的, 本地方法栈是给 JVM 内部的本地方法使用的(JVM 是由 C++ 写的)


4, 程序计数器

用来记录当前程序执行到哪个指令了

程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器
如果当前线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是一个Native方法,这个计数器值为空


5, 元数据区 / 方法区

用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的
在《Java 虚拟机规范中》把此区域称之为“方法区”,而在 HotSpot 虚拟机的实现中,在 JDK 7 时此区域叫做永久代(PermGen),JDK 8 中叫做元空间(Metaspace)


二、内存异常问题

1, 栈溢出

一般在递归的时候会经常遇到栈溢出的 bug , 栈溢出分为两种

  • 如果线程请求的栈的深度大于虚拟机栈中允许的最大深度, 会抛出 StackOverFlow 异常
  • 如果在拓展栈时无法申请到足够的内存空间,则会抛出 OOM 异常(属于内存溢出)

出现 StackOverflowError 时有错误堆栈可以阅读,比较好找到问题所在。如果使用虚拟机默认参数,栈深度在多多数情况下达到1000-2000完全没问题,对于正常的方法调用(包括递归),完全够用

如果是因为多线程导致的内存溢出问题,在不能减少线程数的情况下,只能减少最大堆和减少栈容量的方式来换取更多线程


2, 内存溢出

内存溢出指的是在程序运行过程中申请的内存超出了可用内存资源的情况,导致无法继续分配所需的内存,从而引发异常

常见的内存溢出原因包括创建过多的对象、递归调用导致栈溢出等


3, 内存泄露

内存泄漏指的是在程序中无意中保留了不再需要的对象引用,导致这些对象无法被垃圾回收机制回收,进而占用了不必要的内存空间

内存泄漏则是由于程序中存在不正确的对象引用管理,例如对象被误持有引用、缓存未清理等

内存泄漏则会导致内存资源的浪费,长时间运行下会导致可用内存逐渐减少,最终可能导致内存溢出(OOM)


总结

本篇主要介绍了JVM 中的内存区域划分, 最主要的三部分:

  • 堆:主要存放 new 出来的对象
  • 栈:主要存放局部变量
  • 元数据区:主要存放类被加载后的类对象

以及常见的三种内存异常:栈溢出, 内存溢出, 内存泄漏, 其中内存泄露可能会导致内存溢出

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1058060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重拾C语言】三、分支程序设计(双分支和单分支程序设计、逻辑判断、多分支程序设计、枚举类型表示;典型例题:判断闰年和求一元二次方程根)

目录 前言 三、分支程序设计 3.1 判断成绩是否及格——双分支程序设计 3.2 成绩加上获奖信息—单分支程序设计 3.3 逻辑判断——布尔类型 3.4 获奖分等级——多分支程序设计 3.5 表示汽车种类——枚举类型 3.6 例题 3.6.1 例题——判断某个年份是否闰年 3.6.2 例题—…

SG Former论文学习笔记

超越SWin和CSWin Transformer的新模型 代码地址:https://github.com/OliverRensu/SG-Former 论文地址:https://arxiv.org/pdf/2308.12216.pdf ViT在各种视觉任务中虽然成功,但它的计算成本随着Token序列长度的增加呈二次增长,这在…

前端系列-1 HTML+JS+CSS基础

背景: 前端系列会收集碎片化的前端知识点,作为自己工作和学习时的字典,欢迎读者收藏和使用。 笔者是后端开发😶前端涉猎不深,因此文章重在广度和实用,对原理和性能不会过多深究。 1.html 1.1 html5网页结…

软考中级—— 操作系统知识

进程管理 操作系统概述 操作系统的作用:通过资源管理提高计算机系统的效率;改善人机界面向用户提供友好的工作环境。 操作系统的特征:并发性、共享性、虚拟性、不确定性。 操作系统的功能:进程管理、存储管理、文件管理、设备…

654.最大二叉树

力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给…

BIT-7文件操作和程序环境(16000字详解)

一:文件 1.1 文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明…

uniapp实现微信小程序隐私协议组件封装

uniapp实现微信小程序隐私协议组件封装。 <template><view class"diygw-modal basic" v-if"showPrivacy" :class"showPrivacy?show:" style"z-index: 1000000"><view class"diygw-dialog diygw-dialog-modal bas…

边缘计算网关

一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层&#xff1a;用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…

【网络安全-sqlmap】sqlmap以及几款自动化sql注入工具的详细使用过程,超详细,SQL注入【5】

一&#xff0c;sqlmap 工具的详细使用 kali系统自带这个工具&#xff0c;无需安装直接sqlmap 后面接参数使用 Windows上参照以下方法安装即可 1-1 工具下载 1-1-1 sqlmap下载 sqlmap 工具下载地址&#xff1a; GitHub - sqlmapproject/sqlmap: Automatic SQL injection a…

多线程基础篇(多线程案例)

文章目录 多线程案例1、单例模式1&#xff09;饿汉模式2&#xff09;懒汉模式3&#xff09;线程安全吗&#xff1f;&#xff1f;4&#xff09;解决懒汉模式线程安全问题5&#xff09;解决懒汉模式内存可见性问题 2、阻塞队列1) 阻塞队列是什么&#xff1f;2) 生产者消费者模型1…

大屏自适应容器组件-Vue3+TS

1.引言 在做数字大屏时&#xff0c;图表能跟着浏览器的尺寸自动变化&#xff0c;本文采用Vue3前端框架&#xff0c;采用TypeScript语言&#xff0c;封装了一个大屏自适应组件&#xff0c;将需要显示的图表放入组件的插槽中&#xff0c;就能实现自适应屏幕大小的效果。 2.实际…

mysql-binlog

1. 常用的binlog日志操作命令 1. 查看bin-log是否开启 show variables like log_%;2. 查看所有binlog日志列表 show master logs;3.查看master状态 show master status;4. 重置&#xff08;清空&#xff09;所有binlog日志 reset master;2. 查看binlog日志内容 1、使用mysqlb…

前端相关题目随笔

Vh虽然获取到了视口高度&#xff0c;但是vh会随着屏幕的、大小变化&#xff0c;所以当减去一个数字之后&#xff0c;就会显示错误。 生成id 如果没有设置id&#xff0c;则可以通过new Date.getTime()获取一个时间&#xff0c;作为一个单独的id&#xff0c;也可以通过下载uuid生…

竞赛选题 机器视觉人体跌倒检测系统 - opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器视觉人体跌倒检测系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&…

想要精通算法和SQL的成长之路 - 二叉树的序列化和反序列化问题

想要精通算法和SQL的成长之路 - 二叉树的序列化和反序列化问题 前言一. 二叉树的层序遍历&#xff08;BFS&#xff09;二. 二叉树的序列化与反序列化2.1 序列化操作2.2 反序列化操作 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 二叉树的层序遍历&#xff08;BFS&#xf…

Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群

十一、持久化RDB和AOF 持久化&#xff1a;将数据存入硬盘 11.1 RDB&#xff08;Redis Database&#xff09; RDB&#xff1a;在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c;也就是行话讲的Snapshot快照&#xff0c;它恢复时是将快照文件直接读到内存里。 备份…

操作系统原理-习题汇总

临近毕业&#xff0c;整理一下过去各科习题及资料等&#xff0c;以下为操作系统原理的习题汇总&#xff0c;若需要查找题目&#xff0c;推荐CtrlF或commandF进行全篇快捷查找。 操作系统原理 作业第一次作业选择题简答题 第二次作业选择题简答题 第三次作业选择题简答题 第四次…

acwing215.破译密码题解(容斥原理+mobius函数)

达达正在破解一段密码&#xff0c;他需要回答很多类似的问题&#xff1a; 对于给定的整数 a,b 和 d&#xff0c;有多少正整数对 x,y&#xff0c;满足 x≤a&#xff0c;y≤b&#xff0c;并且 gcd(x,y)d. 作为达达的同学&#xff0c;达达希望得到你的帮助。 输入格式 第一行包…

H5生成二维码

H5生成二维码&#xff1a; 1.引入js库&#xff0c;可自行点击链接复制使用 <script type"text/javascript" src"http://static.runoob.com/assets/qrcode/qrcode.min.js"></script>2.加入二维码占位区HTML <div id"qrCode">…

初识Java 12-2 流

目录 中间操作 跟踪与调试 对流元素进行排序 移除元素 将函数应用于每个流元素 在应用map()期间组合流 Optional类型 便捷函数 创建Optional Optional对象上的操作 由Optional组成的流 本笔记参考自&#xff1a; 《On Java 中文版》 中间操作 ||| 中间操作&#xf…