jvm---7、Metaspace

本文介绍JDK 1.8中引入的Metaspace特性,包括其替代PermGen的原因、如何利用本地内存而非堆内存,以及如何通过-XX参数控制Metaspace的大小与行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdk1.8 取消了PermGen,取而代之的是Metaspace (元空间)

Metaspace使用的是本地内存不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。

可以通过以下参数来指定元空间的大小:


-XX:MetaspaceSize 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize        最大使用空间,防止Metaspace无限的使用本地内存,默认是没有限制的。
-XX:MaxMetaspaceExpansion   Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。
-XX:MinMetaspaceExpansion   Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。


还有两个与 GC 相关的属性: 
-XX:MinMetaspaceFreeRatio,当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。

-XX:MaxMetaspaceFreeRatio 当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。



查看默认配置大小:
$ java -XX:+PrintFlagsInitial | grep Metaspace
uintx InitialBootClassLoaderMetaspaceSize = 4194304          {product}
uintx MaxMetaspaceExpansion = 5452592                             {product}
uintx MaxMetaspaceFreeRatio  = 70                                       {product}
uintx MaxMetaspaceSize  = 18446744073709551615             {product}      #很大,已经超过机器内存
uintx MetaspaceSize    = 21810376                                          {pd product}  #20m左右
uintx MinMetaspaceExpansion    = 340784                              {product}
uintx MinMetaspaceFreeRatio    = 40                                       {product}
bool UseLargePagesInMetaspace    = false                              {product}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值