[转帖]XX:MaxMetaspaceSize大小设置

xx,maxmetaspacesize,大小,设置 · 浏览次数 : 0

小编点评

**MaxMetaspaceSize 设置值:** 根据测试案例,平均每个类需要约 5-7k 的 Non-Class Space 和 600-900 bytes 的 Class Space。因此,如果你的应用程序计划加载10000个类,那么: * Class Space = 10000 个类 * 5-7k = 50-70k * Non-Class Space = 10000 个类 * (600-900 bytes) = 6000-8400 **安全系数:** * 常用的安全系数为 2。因此,因子 2 是比较安全的。 * 因此,设置安全因子为 2,那么需要 20M 的 Class Space 和 160M 的 Non-Class Space,也就是总大小为 180M。 **结论:** MaxMetaspaceSize 设置为 180M 是一个很好的选择。

正文

https://www.jianshu.com/p/9fc0e45ebf0d

 

对于一个被加载到虚拟机中的类,Metaspace需要分配class和no-class空间

 

最大的一部分是 Klass 结构,它是固定大小的。

然后紧跟着两个可变大小的 vtable 和 itable,前者由类中方法的数量决定,后者由这个类所实现接口的方法数量决定。

随后是一个 map,记录了类中引用的 Java 对象的地址,尽管该结构一般都很小,不过也是可变的。

vtable 和 itable 通常也很小,但是对于一些巨大的类,它们也可以很大,一个有 30000 个方法的类,vtable 的大小会达到 240k,如果类派生自一个拥有 30000 个方法的接口,也是同理。但是这些都是测试案例,除了自动生成代码,你从来不会看到这样的类。

 

深入 Non-Class Space

这个区域有很多的东西,下面这些占用了最多的空间:

常量池,可变大小;

每个成员方法的 metadata:ConstMethod 结构,包含了好几个可变大小的内部结构,如方法字节码、局部变量表、异常表、参数信息、方法签名等;

运行时数据,用来控制 JIT 的行为;

注解

 

 

对于正常的类(我们假设通过 bootstrap 和 app 加载的类是正常的),我可以得到平均每个类需要约 5-7k 的 Non-Class Space 和 600-900 bytes 的 Class Space。

 

 

那么,你应该将 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是一个很好的选择。

与[转帖]XX:MaxMetaspaceSize大小设置相似的内容:

[转帖]XX:MaxMetaspaceSize大小设置

https://www.jianshu.com/p/9fc0e45ebf0d 对于一个被加载到虚拟机中的类,Metaspace需要分配class和no-class空间 最大的一部分是 Klass 结构,它是固定大小的。 然后紧跟着两个可变大小的 vtable 和 itable,前者由类中方法的数量决

[转帖]JVM参数:-XX:ReservedCodeCacheSize

通过笨神的分享整理笔记: 这个参数主要设置codecache的大小,比如我们jit编译的代码都是放在codecache里的,所以codecache如果满了的话,那带来的问题就是无法再jit编译了,而且还会去优化。因此大家可能碰到这样的问题:cpu一直高,然后发现是编译线程一直高(系统运行到一定时期)

[转帖]小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio

https://www.cnblogs.com/hellxz/p/14056403.html 写在前边 JVM调优更多是针对不同应用类型及目标进行的调整,往往有很大的实验成份,通过实验来针对当前应用设置相对合适的参数,提高应用程序的性能与稳定性 最近在复习JVM,Parallel Scavenage

[转帖]JVM参数之-XX:SurvivorRatio

https://www.cnblogs.com/hellxz/p/10841550.html 最近面试过程中遇到一些问JVM参数的,本着没用过去学习的办法看了些博客写得不准确,参考oracle的文档记录一下,争取每天记录一点知识点 -XX:SurvivorRatio=6 ,设置的是Eden区与每一个

[转帖]36.堆空间的参数设置和-XX:HandlePromotionFailure

目录 1.堆空间参数2.-XX:HandlePromotionFailure 1.堆空间参数 * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值 * -XX:+PrintFlagsFinal :查看所有的参数的最终值(可能会存在修改,不再是初始值) * 具体查看某个参数

[转帖]JVM参数:带你认识-X和-XX参数

https://www.cnblogs.com/huaweiyun/p/17095557.html 摘要:JVM参数分为三类:标准参数、非标准参数(-X参数)和高级选项(-XX参数)。本文主要为大家讲解-X参数和-XX参数。 本文分享自华为云社区《JVM运行参数之-X和-XX参数》,作者:共饮一杯无

[转帖]JVM底层原理之标配参数、X和XX参数

一、JVM的参数类型 (1)标配参数(以-开头) java -version java -help java -showversion 在JDK各个版本之间稳定,很少有大的变化。 [标准VM参数表] 参数名称描述默认值-d32使用 32 位数据模型 (如果可用)/-d64使用 64 位数据模型 (如

[转帖]关于Java:是否可以覆盖-XX + HeapDumpOnOutOfMemoryError生成的堆转储的文件权限?

https://www.codenong.com/12484559/ Can you override the file permissions for the heap dump produced by -XX+HeapDumpOnOutOfMemoryError? 在Linux上,使用-XX+H

[转帖]高级JIT编译器选项 Advanced JIT Compiler Options

https://zhuanlan.zhihu.com/p/341374302 -XX:+AggressiveOpts 启用积极的性能优化功能, 这些功能有望在以后的版本中成为默认功能. 默认情况下, 此选项处于禁用状态, 并且不使用实验性能功能 Java’s -XX:+AggressiveOpts:

[转帖]G1收集器基本介绍(-XX:+UseG1GC)

概述G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征. 停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可