jvm---7、Metaspace

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}

猜你喜欢

转载自blog.csdn.net/convict_eva/article/details/80650832