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

文章目录

  • 前言
  • 一、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.mzph.cn/news/96047.shtml

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

相关文章

Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件

Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件 大家好,我是艾西有不少小伙伴非常喜欢我的世界Minecraft游戏,今天小编跟大家分享下Minecraft个人服务器怎么设置皮肤站。 Minecraft皮肤站是什么?其实官网就有皮肤站…

关于智能空气动力学

智能空气动力学是指运用智能科学方法和研究范式研究空气运动,尤其是物体与空气相对运动时空气对物体所施作用力规律、气体的流动规律和伴随发生的物理学变化,解决空气动力学问题的新的交叉学科。在空气动力学三大传统研究手段的基础上,智能空…

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址: GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后,场景视图中有栅格线,这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

STM32复习笔记(二):GPIO

目录 (一)Demo流程 (二)工程配置 (三)代码部分 (四)外部中断(EXTI) (一)Demo流程 首先,板子上有4个按键,…

外包做了3个月,技术退步明显。。。。。

先说一下自己的情况,大专生,17年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

科普文章|一文了解平行链及其优势

平行链是一种可以连接到更规模的区块链网络(波卡)的独立区块链。不同于传统区块链(如比特币和以太坊)是孤立的并且无法在本地相互通信,平行链与其他平行链并行运行,并且相互可以无缝通信。平行链还使用波卡…

JS进阶-原型对象prototype

原型 原型就是一个对象,也称为原型对象 构造函数通过原型分配的函数是所有对象所共享的。 JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象,所以我们也称为原型对象 这个对象可以挂载函数,对象…

Golang编译生成可执行程序的三种方法

目录 前言 正文 方法一、 方法二、 方法三、 结尾 前言 Golang是一种强类型、编译型、跨平台的编程语言,相同代码在不同平台上都可以编译出对应的可执行程序。今天就来简单介绍一下如何使用命令编译出可执行程序,本文以windows平台为例进行介绍。 …

关于在 Notion 中使用 Markdown 语法

关于在 Notion 中使用 Markdown 语法 习惯使用的 Markdown 的伙伴们应该知道,当需要加粗字体时,会首先输入 ** **,然后在里面填内容。 但是在 Notion 中,这个就不太行了。它所定义的规则是从前往后,也就是先键入**&…

1.软件测试基础

一、软件测试概念 1.什么是软件 软件是计算机程序,是由计算机代码编写的一系列指令和数据,可以实现各种功能。它指的是计算机系统中的应用程序,包括操作系统、应用软件、驱动程序等。软件可以通过编程语言编写和开发,并可以安装…

网络初识必知会

局域网:把一些设备通过交换机/路由器连接起来 广域网:把更多的局域网也相互连接,当网络规模足够大的 交换机:组网过程中的重要设备! 路由器:组网过程中的重要设备! IP地址:描述一…

QT、c/c++通过宏自动判断平台

QT、c/c通过宏自动判断平台 Chapter1 QT、c/c通过宏自动判断平台 Chapter1 QT、c/c通过宏自动判断平台 原文链接:https://blog.csdn.net/qq_32348883/article/details/123063830 背景 为了更好的进行跨平台移植、编译、调试。 具体操作 宏操作 #ifdef _WIN32//d…

什么,这年头还有人不知道404

写在前面 哥,来帮我看看,这个请求怎么404了,明明接口路径是对的啊!一个下午,组里的小哥突然让我帮忙看这个问题,我不禁一惊,啥,这年头了还有人搞不定404,如有还有&#…

C语言 实现 链 显示 效果 查找 修改 删除

显示所有信息 2023年10月1日的描述:今天放假 2023年10月2日的描述:今天有体育 2023年10月3日的描述:今天有数学 2023年10月4日的描述:今天有语文 2023年10月5日的描述:今天有政治 2023年10月6日的描述:今天交学费 2023年10月7日的描述:今天周末 2023年10月8日的描述:今天给家里…

公司安防工程简要介绍及系统需求分析

多年来 从事安保监控领域的经验,在系统的功能要求、设备选型、施 工控制、 后期维护、人员配备等各方面反复论证,最终形成了本方案。在系统 的硬件选择上,把系统的稳定性、安全性、可靠性放在第一位。根据 招标文件的要求选用当今安防行业具…

FFmpeg:打印音/视频信息(Meta信息)

多媒体文件基本概念 多媒体文件其实是个容器在容器里面有很多流(Stream/Track)每种流是由不同的编码器编码的从流中读出的数据称为包在一个包中包含着一个或多个帧 几个重要的结构体 AVFormatContextAVStreamAVPacket FFmpeg操作流数据的基本步骤 打印音/视频信息(Meta信息…

LVGL_基础控件滚轮roller

LVGL_基础控件滚轮roller 1、创建滚轮roller控件 /* 创建一个 lv_roller 部件(对象) */ lv_obj_t * roller lv_roller_create(lv_scr_act()); // 创建一个 lv_roller 部件(对象),他的父对象是活动屏幕对象// 将部件(对象)添加到组,如果设置了默认组&#xff0c…

vim教程,看完这篇绝对够用啦

简介 vi 是一种命令行的文本编辑器,vim 是进阶版的 vi,gvim是vim的图形化版本。 Vim有几种基本的工作模式: 一般模式(Normal Mode, 命令模式,普通模式)一般模式是vim默认的模式,当打开一个文件时会自动进入此模式。 在此模式下,可以执行移动光标、滚动屏幕、删除字符…

不断优化的素数算法

前言:素数判断是算法中重要的一环,掌握优秀的素数判断方法是算法player的必修课。本文介绍的是由简到繁的素数算法,便于初学者从入门到精通。 素数(质数):只能被 1 和它本身整除的数称作素数,如…

总结二:linux面经

文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改?3、说说常用的Linux命令?4、说说如何以root权限运行某个程序?5、 说说软链接和硬链接的区别?6、说说静态库和动态…