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 是一个很好的选择。

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

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

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

相关文章

社区店选址案例研究:成功与失败的经验教训

大家好,我是一名鲜奶吧5年的创业者,在社区店经营方面有着丰富的经验。 今天,我将分享一些关于社区店选址的成功与失败案例,希望能给想开实体店或创业的朋友们提供有价值的干货信息。 首先,让我们来看看成功的社区店选…

【MobaXterm】Execute command 的问题;Linux环境变量配置;

引言 记录一次使用MobaXterm工具连接数据库时出现的问题。 现象是这样的:通过MobaXterm使用账户A以SSH方式连接登录测试服务器,尝试重启服务。服务启动时提示JDK版本不一致:Unsupported major.minor version 52.0 查询一下java版本 开发环境…

抖音详情API:高效利用缓存机制提升性能

抖音详情API的具体实现细节和参数并不是公开透明的,因为这些信息属于抖音平台的内部API,通常只对合作伙伴或官方开发者开放。因此,我无法为你提供关于抖音详情API的具体代码或参数细节。 然而,关于高效利用缓存机制提升性能的一般…

RedShift 授权操作

RedShift 中只能有一个数据库,是在创建 RedShift 的时候创建的;SCHEMA 是 RedShift 中的模式,可以将 SCHEMA 理解为 MySQL 中的 DATABASES,授权也是针对 SCHEMA 去授权的。 注意: RedShift 中创建的用户默认是有超级管…

安卓面试题 11-20

🔥 11、 解释一下那个Kotlin 代码有什么问题? 🔥 为什么这段代码是错误的?class Student (var name: String) {init() {println("Student has got a name as $name")}constructor(sectionName: String, var id: Int) t…

当CV遇上transformer(一)ViT模型

当CV遇上transformer(一)ViT模型 我们知道计算机视觉(Computer Vision),主要包括图像分类、目标检测、图像分割等子任务。 自AlexNet被提出以来,CNN成为了计算机视觉领域的主流架构。CNN网络结构主要由卷积层、池化层以及全连接层3部分组成,其…

LeetCode 2575.找出字符串的可整除数组:同余问题

【LetMeFly】2575.找出字符串的可整除数组:同余问题 力扣题目链接:https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/ 给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一…

YoloV7改进策略:Block改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘

目录 问题描述 在使用ChatGLMlora微调的时候,报错“AttributeError: ChatGLMTokenizer object has no attribute sp_tokenizer“ ​编辑问题解决: 问题描述 在使用ChatGLMlora微调的时候,报错“AttributeError: ChatGLMTokenizer object h…

使用nginx输入端口号显示404

输入对应的端口号显示404 先检查当前nginx文件夹的路径是没有中文的查看是否没有开启nginx:ctrlaltdelete打开任务管理器,看看有没有nginx.exe进程(一般是有两个进程)如果没有进程说明没有打开nginx,查看端口号是否被…

Vue快速开发一个主页

前言 这里讲述我们如何快速利用Vue脚手架快速搭建一个主页。 页面布局 el-container / el-header / el-aside / el-main&#xff1a;https://element.eleme.cn/#/zh-CN/component/container <el-container><el-header style"background-color: #4c535a"…

SystemVerilog构造、包

包 包提供了一种共享不同构造的附加方式。他们的行为与VHDL包。包可以包含函数、任务、类型和枚举。的语法包是&#xff1a; package package_name; items endpackage : package_name 最终的package_name不是必需的&#xff0c;但它使代码更易于阅读。包是import命令在其他…

「Mybatis深入四」:插入数据后返回主键

一、需求 向数据库插入一条记录后&#xff0c;希望能立即拿到这条记录在数据库中的主键值。 二、代码演示 1、方式1 - useGeneratedKeys 数据库环境 CREATE DATABASE mybatis_db; USE mybatis_db; CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(…

2024.3.7

大端存储&#xff1a;高存低&#xff0c;低存高&#xff1b; 小端存储&#xff1a;高存高&#xff0c;低存低&#xff1b; sizeof 用于获取数据类型或变量的大小&#xff0c;strlen 用于获取字符串的长度。 不能改变常量字符串&#xff0c; char *arr"hello"; *ar…

路径解析(ccf 201604-3)解题思路

问题描述   在操作系统中&#xff0c;数据通常以文件的形式存储在文件系统中。文件系统一般采用层次化的组织形式&#xff0c;由目录&#xff08;或者文件夹&#xff09;和文件构成&#xff0c;形成一棵树的形状。文件有内容&#xff0c;用于存储数据。目录是容器&#xff0c…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】栈和队列

目录 1 -> 栈 1.1 -> 栈的概念及结构 1.2 -> 栈的实现 1.2.1 -> Stack.h 1.2.2 -> Stack.c 1.2.3 -> Test.c 2 -> 队列 2.1 -> 队列的概念及结构 2.2 -> 队列的实现 2.2.1 -> Queue.h 2.2.2 -> Queue.c 1 -> 栈 1.1 -> 栈的…

设计模式:六大原则 ③

一、六大设计原则 &#x1f360; 开闭原则 (Open Close Principle) &#x1f48c; 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易…

Keepalived实验

一、 LVSKeepalived 实验&#xff1a;7-1为主&#xff1b; 7-2为备&#xff1b; 7-3和7-4为后端服务器 1.关闭防火墙和selinux [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02.配置主设备7-1 1.安装ipvsadm和keepalived [rootlocalhost ~]#…

色彩表示空间:RGB、HIS、YUV、YIQ

一、RGB颜色空间 含义&#xff1a; RGB颜色空间使用相加混合法&#xff0c;将三个彩色分量按不同比例叠加&#xff0c;从而在屏幕上呈现出各种颜色。三个分量分别代表红色&#xff08;R&#xff09;、绿色&#xff08;G&#xff09;和蓝色&#xff08;B&#xff09;。 转换计…

接口测试,后端接口还没开发完,如何测?解决看这一篇就够了......

前言 在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回…