当前位置: 首页 > news >正文

Metaspace

1、什么是 Metaspace

Metaspace 区域位于堆外,所以它的最大内存大小取决于系统内存,而不是堆大小,我们可以指定 MaxMetaspaceSize 参数来限定它的最大内存。

Metaspace 是用来存放 class metadata 的,class metadata 用于记录一个 Java 类在 JVM 中的信息,包括但不限于 JVM class file format 的运行时数据:

1、Klass 结构,可以把它理解为一个 Java 类在虚拟机内部的表示
2、method metadata,包括方法的字节码、局部变量表、异常表、参数信息等
3、常量池
4、注解
5、方法计数器,记录方法被执行的次数,用来辅助 JIT 决策
6、 其他

2、什么时候分配 Metaspace 空间

当一个类被加载时,它的类加载器会负责在 Metaspace 中分配空间用于存放这个类的元数据。

3、什么时候回收 Metaspace 空间

分配给一个类的空间,是归属于这个类的类加载器的,只有当这个类加载器卸载的时候,这个空间才会被释放。

所以,只有当这个类加载器加载的所有类都没有存活的对象,并且没有到达这些类和类加载器的引用时,相应的 Metaspace 空间才会被 GC 释放

4、配置 Metaspace 空间

我们只需要关心两个配置参数:

-XX:MaxMetaspaceSize:Metaspace 总空间的最大允许使用内存,默认是不限制。
-XX:CompressedClassSpaceSize:Metaspace 中的 Compressed Class Space 的最大允许内存,默认值是 1G,这部分会在 JVM 启动的时候向操作系统申请 1G 的虚拟地址映射,但不是真的就用了操作系统的 1G 内存。

5、Metaspace 和 GC

Metaspace 只在 GC 运行并且卸载类加载器的时候才会释放空间。当然,在某些时候,需要主动触发 GC 来回收一些没用的 class metadata,即使这个时候对于堆空间来说,还达不到 GC 的条件。

Metaspace 可能在两种情况下触发 GC:

1、分配空间时:虚拟机维护了一个阈值,如果 Metaspace 的空间大小超过了这个阈值,那么在新的空间分配申请时,虚拟机首先会通过收集可以卸载的类加载器来达到复用空间的目的,而不是扩大 Metaspace 的空间,这个时候会触发 GC。这个阈值会上下调整,和 Metaspace 已经占用的操作系统内存保持一个距离。

2、碰到 Metaspace OOM:Metaspace 的总使用空间达到了 MaxMetaspaceSize 设置的阈值,或者 Compressed Class Space 被使用光了,如果这次 GC 真的通过卸载类加载器腾出了很多的空间,这很好,否则的话,我们会进入一个糟糕的 GC 周期,即使我们有足够的堆内存。

所以大家千万不要把 MaxMetaspaceSize 设置得太小

6、Metaspace默认不受限,那为什么要限制 Metaspace 的大小呢?

  • 告警系统需要知道,为什么 Metaspace 空间以一个异常的速度在消耗,需要有人去看一下发生了什么。
  • 有时候需要限制虚拟内存地址的大小。通常我们感兴趣的是实际消耗内存,但是虚拟内存大小可能会导致虚拟机进程达到系统限制。

如果要限制 Metaspace 大小使得系统更容易被监控,同时不用在乎虚拟地址空间的大小,那么最好只设置 MaxMetaspaceSize 而不用设置 CompressedClassSpaceSize。如果要单独设置,那么最好设置 CompressedClassSpaceSize 为 MaxMetaspaceSize 的 80% 左右。

除了 MaxMetaspaceSize 之外,减小 CompressedClassSpaceSize 的唯一原因是减小虚拟机进程的虚拟内存大小。 但是,如果将 CompressedClassSpaceSize 设置得太低,则可能在用完 MaxMetaspaceSize 之前先用完了 Compressed Class Space。 在大多数情况下,比率为1:2(CompressedClassSpaceSize = MaxMetaspaceSize / 2)应该是安全的。

7、MaxMetaspaceSize 设置为多大合适呢?

那么,你应该将 MaxMetaspaceSize 设置为多大呢? 首先应该是计算预期的 Metaspace 使用量。你可以使用上面给出的数字,然后给每个类约 1K 的 Class Space 和 3~8K 的 Non-Class Space 作为缓冲。

因此,如果你的应用程序计划加载10000个类,那么从理论上讲,你只需要 10M 的 Class Space 和 80M Non-Class Space。

然后,你需要考虑安全系数。在大多数情况下,安全因子 2 是比较安全的。你当然也可以碰运气,设置低一点,但是要做好在碰到 OOM 后调大 Metaspace 空间的准备。

如果设置安全因子为 2,那么需要 20M 的 Class Space 和 160M 的 Non-Class Space,也就是总大小为 180M。因此,在这里 -XX:MaxMetaspaceSize=180M 是一个很好的选择。

设置值:理论值*安全因子

相关文章:

  • CEF c++调用JS,并获得JS返回值的 流程
  • 2024 AI 辅助研发的新纪年
  • C++泛型实现搜索二叉树
  • Java基础-内部类
  • Excel中筛选合并单元格后,只显示第一行怎么办?
  • [递归、搜索、回溯]----递归
  • 将List转换为数组或者将数组转换为List,如果改变了原始值,转换后的数据会发生改变吗?
  • 设计模式大题做题记录
  • 安装系统后,如何单个盘空间扩展多个盘空间?
  • ChatGPT的安全警告
  • 一篇搞定分布式缓存
  • 低空经济20人|卓翼智能任雪峰:以技术驱动市场,引领无人机细分领域创新
  • 找出单身狗1,2
  • 航测管家:智能化革新航测作业流程
  • bugku-misc隐写
  • Codepen 每日精选(2018-3-25)
  • linux学习笔记
  • Map集合、散列表、红黑树介绍
  • node和express搭建代理服务器(源码)
  • Zsh 开发指南(第十四篇 文件读写)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 免费小说阅读小程序
  • 前端相关框架总和
  • 三分钟教你同步 Visual Studio Code 设置
  • 什么软件可以剪辑音乐?
  • 译自由幺半群
  • 正则表达式小结
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 仓管云——企业云erp功能有哪些?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #控制台大学课堂点名问题_课堂随机点名
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)(1.13) SiK无线电高级配置(六)
  • (二)hibernate配置管理
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)VC++中ondraw在什么时候调用的
  • (转)用.Net的File控件上传文件的解决方案
  • .NET Framework杂记
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 发送邮件
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net反编译的九款神器
  • /3GB和/USERVA开关
  • /bin/rm: 参数列表过长"的解决办法
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Autowired多个相同类型bean装配问题
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [1]-基于图搜索的路径规划基础
  • [17]JAVAEE-HTTP协议
  • [AAuto]给百宝箱增加娱乐功能
  • [Android]使用Git将项目提交到GitHub