【JVM】JVM 运行时数据区简介

文章目录

  • 🌴简介
  • 🌲堆(线程共享)
  • 🎄本地方法栈(线程私有)
  • 🌳程序计数器(线程私有)
  • 🍀方法区(线程共享)
    • 🌸JDK 1.8 元空间的变化
    • 🌸运行时常量池
  • 🎍小结
  • 🍀内存布局中的异常问题
    • 🌸Java堆溢出
    • 🌸虚拟机栈和本地方法栈溢出
  • ⭕总结

🌴简介

JVM 运⾏时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型((Java Memory Model,简
称 JMM)完全不同,属于完全不同的两个概念,它由以下 5 ⼤部分组成:
在这里插入图片描述

🌲堆(线程共享)

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

Java 虚拟机栈中包含了以下 4 部分:
在这里插入图片描述

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

除此之外,Java虚拟机栈还是线程私有的。

那什么是线程私有?

由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,因此在任何一个确定的时刻,一个处理器(多核处理器则指的是一个内核)都只会执行一条线程中的指令。因此为了切换线程后能恢复到正确的执行位置,每条线程都需要独立的程序计数器,各条线程之间计数器互不影响,独立存储。我们就把类似这类区域称之为"线程私有"的内存

🎄本地方法栈(线程私有)

本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。这里就不做过多讲解了

🌳程序计数器(线程私有)

程序计数器的作用:用来记录当前线程执行的行号的。

程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。

如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

如果正在执行的是一个Native方法,这个计数器值为空。

程序计数器内存区域是唯一一个在JVM规范中没有规定任何OOM情况的区域!

🍀方法区(线程共享)

方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

在《Java虚拟机规范中》把此区域称之为“方法区”,而在 HotSpot 虚拟机的实现中,在 JDK 7 时此区域叫做永久代(PermGen),JDK 8 中叫做元空间(Metaspace)。

注意:永久代(PermGen)和元空间(Metaspace)是 HotSpot
中对《Java虚拟机规范》中方法区的实现

  • 它们三者之间的关系就好比,对于一辆汽车来说它定义了一个部分叫做“动能提供装置”,但对于不同的汽车有不同的实现技术,比如对于燃油车来说,它的“动能提供装置”的实现技术就是汽油发动机(简称发动机),而对于电动汽车来说,它的“动能提供装置”的实现就是电动发动机(简称电机),发动机和电机就相当于永久代和元空间一样,它是对于“制动器”也就是方法区定义的实现。

🌸JDK 1.8 元空间的变化

  1. 对于 HotSpot 来说,JDK 8 元空间的内存属于本地内存,这样元空间的大小就不在受 JVM
    最大内存的参数影响了,而是与本地内存的大小有关。
  2. JDK 8 中将字符串常量池移动到了堆中。

🌸运行时常量池

运行时常量池是方法区的一部分,存放字面量与符号引用。

字面量 : 字符串(JDK 8 移动到堆中) 、final常量、基本数据类型的值。

符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符

🎍小结

对上述内容进行一个小结,关系图如下:

在这里插入图片描述

🍀内存布局中的异常问题

🌸Java堆溢出

Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免来GC清除这些对象,那么在对象数量达到最大堆容量后就会产生内存溢出异常。

Java堆内存的OOM异常是实际应用中最常见的内存溢出情况。当出现Java堆内存溢出时,异常堆栈信息"java.lang.OutOfMemoryError"会进一步提示"Java heap space"。当出现"Java heap space"则很明确的告知我们,OOM发生在堆上。

这里我们需要注意内存泄漏与内存溢出的区别

  • 内存泄漏 : 泄漏对象无法被GC
  • 内存溢出 : 内存对象确实还应该存活。此时要根据JVM堆参数与物理内存相比较检查是否还应该把JVM堆内存调大;或者检查对象的生命周期是否过长。

🌸虚拟机栈和本地方法栈溢出

由于我们HotSpot虚拟机将虚拟机栈与本地方法栈合二为一,因此对于HotSpot来说,栈容量只需要由-Xss参数来设置。

关于虚拟机栈会产生的两种异常:

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

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

⭕总结

感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件的读取与操作

文件类型: 从文件功能的角度来分类: 1.程序⽂件 程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。 2. 数据⽂件 ⽂件…

Office办公软件之word的使用(一)

前几天调整公司招标文件的格式,中途遇到一些问题,感觉自己还不是太熟悉操作,通过查阅资料,知道了正确的操作,就想着给记下来。如果再次遇到,也能很快地找到解决办法。 一、怎么把标题前的黑点去掉 解决办法…

latex $$斜体间距太大 解决方案

不要直接$NPSB$, 而是使用$\textit{NPSB}$

Node Sass does not yet support your current environment

项目运行时报错:Node Sass does not yet support your current environment 原因是node版本过高。 解决办法: 使用nvm管理node版本,(如何安装nvm?请点击跳转) 具体步骤如下: 1.查看当前node…

工业新力军!你不知道的工业电脑触摸一体机

作为普通用户,接触最多的电脑肯定是商用台式电脑、笔记本电脑以及平板电脑等,这类电脑产品面向的均是个人需求。那工业级触摸一体机电脑又是什么?它究竟有何特点能够在工业行业中大放异彩呢? 工业电脑的好处是:1、壳子…

电源设计中的去耦电容深入理解及应用实例,非常实用!

很多新手设计电路,通常会觉得电源的设计很简单,不就是线性电源和开关电源吗?找个参考设计抄一下就行了。。。。。 因此,电源往往是我们在电路设计过程中最容易忽略的环节。相反,电源虽然是设计中非常基础的部分&#x…

Python爬虫如何快速入门

写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。 一、什么是网络爬虫 网络爬虫,英文名称为Web Crawler或Spider,是一种通过程序在互联网上自动获取…

接口测试详解

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试&#xff0…

工业级POE交换机的SSH配置步骤

工业级POE交换机的SSH(Secure Shell)配置可以通过以下步骤进行: 1. 连接到POE交换机:使用一个支持SSH协议的终端工具(如PuTTY)连接到POE交换机的管理接口。 2. 登录到POE交换机:输入正确的用户…

c++核心学习--继承2

4.6.7多继承语法 4.6.8菱形继承 利用虚继承解决菱形继承的问题:继承之前加上关键字virtual变为虚继承

C++|类封装、类的分文件编写练习:设计立方体类、点和圆的关系

文章目录 练习案例1:设计立方体类CPP代码 练习案例2:点和圆的关系CPP代码 代码总结类的分文件编写 练习案例1:设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 CPP代码 class Cube { pub…

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库,用于创建图形用户界面(GUI)。其中,QTextEdit 控件作为一个灵活多用的组件,常用于显示和编辑多行文本内容,支持丰富的格式设置和文本操作功能。另外,QSlider 控件是一…

Mybatis细节详解

上一篇分享了一个Mybatis的快速入门案例&#xff0c;本贴再详细说明几个细节点~ 一.Mapper代理开发 1.定义接口 定义一个接口&#xff0c;并在resources中定义mapper文件夹&#xff0c;文件夹中存放同名的xml配置文件。 2.设置namespace属性 <?xml version"1.0&qu…

信息化平台管理系统智能引擎,互联网企业转型升级的新篇章-亿发

企业管理系统一直在伴随着中国互联网企业的发展而不断进步。过去&#xff0c;企业管理主要依赖于传统的表格和图表记录&#xff0c;但随着互联网企业的崛起&#xff0c;他们开始尝试自己开发简易的管理系统以满足业务需求。随着企业规模和业务复杂度的增加&#xff0c;互联网企…

安达发|印染行业选择APS自动排单软件需要注意什么?

在印染行业中&#xff0c;APS&#xff08;高级计划排程系统&#xff09;自动排单软件的应用可以极大地提升生产效率、减少浪费、优化资源分配&#xff0c;并提高客户满意度。然而&#xff0c;在选择和实施APS自动排单软件时&#xff0c;企业需要注意以下几个关键点&#xff1a;…

【漏洞复现】用友U8 login2.RegisterServlet接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

6款最值得推荐的电脑监控软件丨高人气甄选

突然收到老板发问&#xff1a; 就问你抖不抖&#xff01;&#xff01;&#xff01; 后来才得知&#xff0c;老板安装了电脑监控软件。 但具体是哪款不太晓得&#xff0c;鉴于此专门去调研了一番&#xff0c;给大家看看小编的调研成果。 有哪些电脑监控软件呢&#xff1f; 一…

介绍一下Redis的集群模式?

Redis有三种主要的集群模式&#xff0c;用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是&#xff1a;主从复制&#xff08;Master-Slave Replication&#xff09;、哨兵模式&#xff08;Sentinel&#xff09;和Redis Cluster模式。 一、问题解析 主从模式 主从…

【企业动态】吉利雷达汽车来访东胜物联,考察交流,洽谈车联网生态合作

近日&#xff0c;我们非常高兴接待吉利雷达汽车一行莅临东胜物联位于湖州市的生产工厂&#xff0c;进行参观考察&#xff0c;并就未来的合作展开深入商讨与交流。 雷达新能源汽车隶属于吉利控股集团&#xff0c;是一家专注于户外生态的中高端新能源智能汽车企业。雷达通过共享吉…

高阶数据结构 <红黑树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文红黑树简介红黑树整体结构红黑树节点的定义红黑树主体类设计红黑树的插入函数情况一&#xff1a;变色情况二&#xff1a;变色旋转单旋情况双旋情况 完整插入代码 关于红黑树红黑树检…