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

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

前言

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

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

理论学习

使用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:读者可以根据自己的实际情况再调整)。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。
image

源码分析

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没有关系了。
image

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

最后

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

相关文章
|
3月前
|
算法 C++ 容器
C++ STL:空间配置器源码解析
C++ STL:空间配置器源码解析
|
3月前
|
Java
jvm性能调优实战 - 46堆区OOM解析
jvm性能调优实战 - 46堆区OOM解析
40 0
|
15天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
2月前
|
存储 Java
JVM整体结构解析
JVM整体结构解析
|
2月前
|
存储 弹性计算 固态存储
阿里云服务器租用费用1t空间多少钱?全面解析
阿里云服务器租用费用1t空间多少钱?1T空间如果是系统盘SSD云盘价格是3686元一年、ESSD云盘1t空间是5222元一年,ESSD Entry云盘1024G存储空间价格是2580元一年。阿里云百科整理几款不同的云盘1t空间价格
|
7月前
|
监控 Oracle 数据可视化
深度解析JVM性能监控工具:推荐与详细用法
深度解析JVM性能监控工具:推荐与详细用法
210 0
|
7月前
|
存储 缓存 安全
万字完整深入解析JVM面试必备,原来这就是和年薪百万的差距
工作之余,想总结一下JVM相关知识。话不多说直接进入主题
|
8月前
|
存储 算法 Java
JAVA虚拟机(JVM)-- 万字解析
JAVA虚拟机(JVM)-- 万字解析
136 1
|
4月前
|
存储 前端开发 Java
深入解析JVM内存结构:Metaspace、堆与垃圾收集器
深入解析JVM内存结构:Metaspace、堆与垃圾收集器
|
5月前
|
缓存 算法 Java
JVM CMS GC算法解析
JVM CMS GC算法解析
41 0

推荐镜像

更多