专栏首页Java架构学习路线深入理解JVM:元空间大小详细解析
原创

深入理解JVM:元空间大小详细解析

前言

JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用元空间(Metaspace)代替了永久代。永久代和元空间保存的数据并不完全一样,永久代中还保存另一些与类的元数据无关的杂项。

在Java 7里将字符串常量从永久代移动到了堆区域,但是永久代并没有完全改造完成。直到Java 8,永久代的改造才算完全搞定,在元空间中保存的数据比永久代中纯粹很多,就是类的元数据,这些信息只对编译期或JVM的运行时有用。

理论学习

使用Java 8以后,关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N,对于64位JVM来说,元空间的默认初始大小是20.75MB,默认的元空间的最大值是无限。MaxMetaspaceSize用于设置metaspace区域的最大值,这个值可以通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,表示无穷大。

由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M(PS:读者可以根据自己的实际情况再调整)。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

源码分析

MetaspaceSize表示metaspace首次使用不够而触发FGC的阈值,只对触发起作用,原因是:垃圾搜集器内部是根据变量 _capacity_until_GC来判断metaspace区域是否达到阈值的,初始化代码如下所示:

void MetaspaceGC::initialize() {
 // Set the high-water mark to MaxMetapaceSize during VM initializaton since
 // we can't do a GC during initialization.
  _capacity_until_GC = MaxMetaspaceSize;
} 

GC收集器会在发生对metaspace的回收会,会计算新的capacityuntil_GC值,以后发生FGC就跟MetaspaceSize没有关系了。

如果不设置MetaspaceSize,则默认的capacityuntil_GC为20M左右,具体代码如下:

最后

欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python进阶之异步任务

    本文学习视频来自莫凡python,下面是总结的学习内容。 关于星球,我在稍微阐述一点,我用自己的精力在星球中发布小项目,发布日打卡,共同来学习某一块知识,所以改...

    公众号guangcity
  • 回归Android,继续刷题

    这两天要做个安卓项目,哎,我之前是做安卓开发的,做了半年多,后面就没做了,距离现在至少1年半有余。

    公众号guangcity
  • 做了这么久的程序员,你知道为什么会有 Lambda 表达式吗?

    Java8 有一些新的特性,今天老顾给大家分享一下关于 Lambda 表达式的由来,一开始感觉 Lambda 可读性蛮差的,不知道为什么 Java8 会出来这个...

    淡定的蜗牛
  • django--ajax的使用,应用

    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服...

    测试开发社区
  • matlibplot绘制各种图形

    0.导语1.预备知识1.1 np.arange()1.2 numpy.random.uniform()1.3 zip()2.bar绘制3.散点图4.3D图5.参...

    公众号guangcity
  • 聊聊nacos的HttpHealthCheckProcessor

    nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthChec...

    codecraft
  • TensorFlow线性回归与逻辑回归实战

    Huber loss是为了增强平方误差损失函数(squared loss function)对噪声(或叫离群点,outliers)的鲁棒性提出的。

    公众号guangcity
  • 如何理解数组在Java中作为一个类?【完整版】

    Java中数组的使用方法和C/C++中的比较类似,但是在Java中它的本质是一个Java类,只是这个类比较特殊,所以很容易被一些程序员误解。建议在回答该问题的时...

    用户4143945
  • 设计模式之观察者模式

    今天我继续和大家分享一下设计模式中的知识,今天我们来看一下观察者模式。观察者模式也可以叫发布订阅模式,在实际的场景中有很多时候会遇到这种设计模式。在现实的生活中...

    吉林乌拉
  • Hadoop3.x伪分布式及Hbase搭建与单词统计项目构建

    本节从0开始一步步搭建伪分布式及Hbase等。同时学习使用Intellij Maven构建Map-Reduce项目进行单词统计。

    公众号guangcity

扫码关注云+社区

领取腾讯云代金券