为了账号安全,请及时绑定邮箱和手机立即绑定

JVM元空间在调整大小时是否总是触发GC

JVM元空间在调整大小时是否总是触发GC

慕森卡 2023-04-19 15:02:33
对于 Java 8 之后的 JVM当 metaspace 的大小 > 时-XX:metaspaceSize,会触发 gc。不管你如何配置-XX:metaspaceSize,-XX:maxMetaspaceSize元空间的初始大小在64位服务器上通常是一个固定值(20.8M)。当 JVM 接近当前容量时,它会自动调整元空间的大小。那么以-XX:metaspaceSize20G为例,当前metaspace大小为18M,需要分配大量新对象(100M左右),JVM必须为这些新对象resize metaspace,JVM会不会在resize之前触发full GC ?
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

首先,“元空间的大小”是模棱两可的,因此没有上下文就没有意义。至少有五个指标:reservedcommittedcapacityused memory ,如this answer中所述,以及高水位线,也称为capacity_until_gc

//img4.sycdn.imooc.com/643f925f0001ee8c04930422.jpg

元空间不仅仅是一个连续的内存区域,因此它不会按常识调整大小。相反,当分配发生时,上述一个或多个指标会发生变化。

  1. 在最快的路径上,从当前块中分配一块元数据。used在这种情况下,内存会增加,仅此而已。

  2. 如果当前块中没有足够的空间,JVM 会搜索可能空闲的现有块。如果成功重用块,capacity则增加。直到此时才会发生 GC。

  3. 如果没有空闲块,JVM 会尝试提交更多内存,除非新committed大小超过capacity_until_gc.

  4. 如果capacity_until_gc达到阈值,JVM 将触发 GC 周期。

  5. 如果 GC 没有释放足够的内存,则会增加高水位线,以便分配另一个虚拟空间。

GC 之后,高水位线值根据以下JVM 标志进行调整:

  • -XX:MinMetaspaceFreeRatio(用于计算元空间容量中需要多少可用空间来决定增加多少HWM);

  • -XX:MaxMetaspaceFreeRatio(用于决定在降低 HWM 之前元空间容量中需要多少可用空间);

  • -XX:MinMetaspaceExpansion(以字节为单位的元空间的最小扩展);

  • -XX:MaxMetaspaceExpansion(没有完全 GC 的 Metaspace 的最大扩展)。

TL;DR没那么简单。JVM 绝对可以在不触发 GC 的情况下提交更多的 Metaspace 内存。但是,当达到 HWM 时,将触发 GC,并根据人体工程学策略重新计算 HWM。


查看完整回答
反对 回复 2023-04-19
?
守着一只汪

TA贡献1872条经验 获得超3个赞

您可以配置元空间大小,但 JVM 可以根据相关平台增加或减少大小。

-XX:MetaspaceSize=大小

设置分配的类元数据空间的大小,该空间将在第一次超出时触发垃圾回收。垃圾回收的阈值根据使用的元数据量增加或减少。默认大小取决于平台。


查看完整回答
反对 回复 2023-04-19
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信