深入JVM元空间以及弹性伸缩机制

news2024/9/23 11:18:06

个人博客

深入JVM元空间以及弹性伸缩机制 | iwts’s blog

JVM内存模型中元空间所在位置

即在JVM运行时的内存模型。总体上有这样的图:

元空间

上面的图其实有点不太准。方法区本质上只是JVM的一个标准,不同JVM在不同版本下都可能有不同的实现,例如JDK1.7之前的永久代之类的。

这里主要聊JDK1.8下HotSpot的实现:元空间。

元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过参数来指定元空间的大小:

  1. -XX:MetaspaceSize,初始空间大小,达到该值就会触发GC进行类型卸载,同时JVM会对该值进行调整。

    a> 如果释放了大量的空间,就适当降低该值。

    b> 如果释放了很少的空间,那么在不超过MaxMetaspaceSize的前提下,适当提高该值。

  2. -XX:MaxMetaspaceSize,最大空间大小,默认是没有限制的。

元空间也有溢出,超过了最大空间则会OOM,但是会明显提示:

Metaspace OutOfMemoryError

但是相比而言,因为用的本地内存,所以总归还是大很多的,只要最大空间设的足够大,OOM几率要比1.7之前的永久代低很多。

元空间是放在堆外内存,所有JVM线程间共享,它存储每一个类的结构。其中包括:

  1. 运行时常量池。
  2. 字段和方法数据。
  3. 方法和构造函数的代码。
  4. 还有特殊的方法用于类和实例的初始化,以及接口的初始化。
  5. JIT代码缓存。

元空间两大组成

Metaspace由两大部分组成:

  1. Klass Metaspace。
  2. NoKlass Metaspace。

klass其实就是class的意思,区分一下概念。

Klass Metaspace

Klass本质上是class文件在JVM里的运行时数据结构,但是Class的实例对象是存在堆里的,两者没有关系。

而Klass存储在压缩类空间中。

压缩类空间 Compressed Class Pointer Space

压缩类空间(Compressed Class Pointer Space),是一块连续的内存区域,紧接着堆。通过-XX:CompressedClassSpaceSize来控制这块内存的大小,默认是1G。

NoKlass Metaspace

就是相反,只要不是压缩类空间,但是在元空间中的,就都是NoKlass Metaspace。

专门来存class相关的其他的内容,比如方法数据,运行时常量池等,可以由多块不连续的内存组成。

但是也可以存class,如果压缩类空间不存在,那么class就存在这里。

运行时常量池

类或接口的字节码文件里的常量池的运行时表示形式,它包含几种常量。例如:

  1. 编译时就已经知道的数字字面量值。
  2. 必须在运行时解析的方法和字段的引用。

运行时常量池的功能类似于传统语言的符号表,不过它包含的数据会更加宽泛。

运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class类都有一个运行时常量池,而被该类全部的实例对象共用。类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

例如static变量、方法,都是在运行时常量池中。

运行时常量池分配在JVM的NoKlass Metaspace,类或接口的运行时常量池在类或接口被JVM创建时才会构建。

元空间内存管理

在元空间中,类和其元数据的生命周期与其对应的类加载器相同,只要类的类加载器是存活的,在Metaspace中的类元数据也是存活的,不能被回收。

每个加载器有单独的存储空间,通过 ClassLoaderMetaspace来进行管理 SpaceManager* 的指针,相互隔离的。

所以GC本身是不处理元空间的,因为只要类加载器没有问题,里面的数据必然在其生命周期内,就算GC也不能认为是垃圾。

但是可以执行卸载,直接卸载类加载器。如果某个类加载器不再存活,那么会卸载整个类加载器下的元空间数据。

Metaspace VM利用块分配器(Chunking Allocator)来管理元空间的内存分配。块的大小依赖于类加载器的类型。

Metaspace VM中有一个全局的可使用的块列表(A Global Free List of Chunks)。当类加载器需要一个块的时候,类加载器从全局块列表中取出一个块,添加到它自己维护的块列表中。当类加载器死亡,它的块将会被释放,归还给全局的块列表。

元空间弹性伸缩

由于元空间和堆并不在一起,所以这块的空间可以不用设置或者单独设置。但是一般情况下,为了避免元空间耗尽 JVM 的内存,所以都会设置 MaxMetaSpaceSize,即最大元空间大小。

在运行过程中,如果实际大小小于这个值,JVM 就会通过 -XX:MinMetaspaceFreeRatio-XX:MaxMetaspaceFreeRatio两个参数动态控制整个 MetaSpace 的大小。

这个动态控制的过程就是弹性伸缩。

但是弹性伸缩执行的时候性能很差,为了避免弹性伸缩带来的额外 GC 消耗,一般情况下是保证元空间大小不变,也就是将-XX:MetaSpaceSize-XX:MaxMetaSpaceSize两个值设置为固定。

但是这样也会导致在空间不够的时候无法扩容,然后频繁地触发 GC,最终 OOM。

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

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

相关文章

Java进阶学习笔记28——StringJoiner

Java中,有没有即能高效,又能实现更方便的拼接呢? StringJoiner: JDK8才开始的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的。 好…

动态路由实验—OSPF

动态路由协议实验-------OSPF 链路状态路由选择协议又被称为最短路径优先协议&#xff0c;它基SPF&#xff08;shortest path first &#xff09;算法 实验要求&#xff1a;各个PC之间能够互通 1.四台PC配置如下 PC1 PC2 PC3 PC4 2.配置各个交换机的口子的IP R1 <HUAWE…

文件批量重命名利器:一键轻松替换文本间内容,高效管理文件不再是难题!

在信息爆炸的时代&#xff0c;我们的电脑中堆积了无数的文件。这些文件可能包含重要的工作资料、珍贵的个人回忆或是各种学习资料。然而&#xff0c;随着文件的不断增多&#xff0c;如何高效地管理和查找这些文件成为了一个头疼的问题。 文件批量改名高手是一款专业的文件管理…

轮廓系数(Average silhouette) | 最佳聚类数的判定

1.最佳分类个数 # 辅助确定最佳聚类数 4.7*2.6 factoextra::fviz_nbclust( t(DPAU_2), kmeans, method "silhouette")在2有下降拐点&#xff0c;但是样本较多时分成2类一般意义不大。 在7时也有下降拐点。 2.查看每个分类的轮廓系数 (1) pam k5 library(cluste…

基于地理坐标的高阶几何编辑工具算法(7)——矩形绘制

文章目录 工具步骤应用场景示意图算法原理工具步骤 点击矩形绘制工具,点击三个点完成矩形绘制。 应用场景 用于在地图上快速绘制任意方向的矩形。 示意图 算法原理 点第一个点确定矩形的一个角点P1,也作为平移后的坐标原点,生成平移矩阵。点第二个点P2,确定矩形的一条边…

大学高校智能制造技术实验室,工业物联数字孪生系统,三维可视化平台

上午院方领导老师现场观摩项目验收前成果展示&#xff0c;深入了解工作情况。随后召开技术交流会&#xff0c;对我司研发团队打破常规敢先试&#xff0c;精益求精给予肯定&#xff0c;并提出指导意见。在智能制造数字孪生系统平台开发调试、数据采集过程中&#xff0c;我司成功…

ollama 使用,以及指定模型下载地址

ollama windows 使用 官网&#xff1a; https://ollama.com/ windows 指定 models 下载地址 默认会下载在C盘 &#xff0c;占用空间 在Windows系统中&#xff0c;可以通过设置环境变量OLLAMA_MODELS来指定模型文件的下载和存储路径。具体操作步骤如下&#xff1a; 1.打开系统…

JVM堆分配中TLAB分配方案

个人博客 JVM堆分配中TLAB分配方案 | iwts’s blog Java对象的内存分配过程如何保证线程安全 对象的内存分配过程中&#xff0c;主要流程是将对象的引用指向一个具体的内存区域&#xff0c;然后进行初始化操作。 但是&#xff0c;因为堆是全局共享的&#xff0c;因此在同一…

图像处理ASIC设计方法 笔记24 等价表和标记代换

(一)等价表的整理与压缩 1.1 等价关系的识别与追踪 在初步标记过程完成后,等价表的整理和压缩变得至关重要。这一阶段的首要任务是从等价表的地址1开始,对等价表进行逐个扫描。在扫描过程中,系统将检查每个临时标记是否存在等价关系。若发现等价关系,系统将执行追踪过程,…

9.js函数

函数是js复杂数据类型的一种---可以理解为存放代码的盒子 用来帮助我们封装、复用、扩展以及调用代码的工具 函数的两个阶段 &#xff08;1&#xff09;声明函数&#xff08;理解为创造&#xff09; ——声明式声明 语法&#xff1a;function 函数名(参数){...代码} ——赋值时…

for循环里如果std::pair的类型写不对,可能会造成性能损失

第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格&#xff0c;是因为ms在调试的时候&#xff0c;尤其是模板比较多的时候&#xff0c;经常断点的行号有问题。比如第5行的断点&…

Linux服务的简介与分类

服务的简介与分类 服务的分类 查询已安装的服务和区分服务 #列出所有rpm包默认安装服务的自启动状态 [rootlocalhost ~]# chkconfig --list atd atd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [rootlocalhost ~]# chkconfig --list sshd sshd …

从零起航,Python编程全攻略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python入门之旅 二、Python进阶之道 三、Python爬虫实战 四、Python数据分析利器 五…

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available()&#xff0c;显示True&#xff0c;在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…

Nginx配置文件简介与配置实例(负载均衡、动静分离、高可用集群)- 细节狂魔

文章目录 前言Nginx配置文件组成Nginx配置文件三个部分第一部分&#xff1a;全局块第二部分&#xff1a;events 块第三部分&#xff1a;http 块http 全局块server 块location 块 Nginx 配置实例实例1 - 反向代理预期实现效果具体实现 实例2 - 反向代理实现效果准备工作一&#…

SVN创建分支,分支合并,切换分支。通俗易懂

1、首先在svnbucket.com远程仓库上创建项目&#xff0c;这里我创建了个测试demo&#xff1a; 2、先把svn仓库的项目检出到自己的文件夹&#xff0c;我这里是demo001文件夹&#xff0c;此时并没有创建truck, branches, tags这三个目录&#xff1a; 3、 在demo001文件夹里新建tru…

民国漫画杂志《时代漫画》第22期.PDF

时代漫画22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…

民国漫画杂志《时代漫画》第23期.PDF

时代漫画23.PDF: https://url03.ctfile.com/f/1779803-1248634922-4eafac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

斯坦福2024人工智能指数报告 1

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika、Jack Clark等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多…