元空间所占的内存是否在-Xmx2g中体现

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累



元空间(Metaspace)所占的内存不包括在 -Xmx 配置的堆内存范围内,但它仍然会消耗系统的内存。


解释:

  • -Xmx:用于配置堆内存的最大值(即 JVM 用于存储对象的内存区域),它不包括 元空间。

  • 元空间(Metaspace):JVM 的类元数据存储区域,存储类的结构信息、常量池等数据。从 JDK 8 开始,元空间取代了原来 PermGen(永久代)的角色。元空间的内存不再使用堆内存,而是直接使用本地内存(Native Memory)。


内存布局:

  • 堆内存:由 -Xms 和 -Xmx 配置,存储 Java 对象。

  • 元空间:存储类元数据、方法元数据等,不受 -Xmx 限制,可以根据需求动态扩展。默认情况下,元空间的最大内存是没有明确限制的,但可以通过 -XX:MaxMetaspaceSize 来设置其最大值。

元空间和堆内存的关系:

  • 堆内存(Heap Memory):用于存储应用程序的对象实例。

  • 元空间(Metaspace):用于存储类的元数据,不受 -Xmx 限制。它默认位于本地内存中。


默认情况下,JVM 会自动管理元空间的大小:

  • -XX:MaxMetaspaceSize:可以限制元空间的最大内存大小。


    • 如果没有指定该参数,元空间的大小会根据实际需求动态调整。

    • 设置 -XX:MaxMetaspaceSize=<size> 来限制元空间的最大大小,例如 -XX:MaxMetaspaceSize=512m 来限制最大为 512 MB。

例如:

java -Xmx2g -XX:MaxMetaspaceSize=512m -jar myapp.jar
  • -Xmx2g:堆内存最大为 2 GB。

  • -XX:MaxMetaspaceSize=512m:元空间的最大大小为 512 MB。


docker配置注意:

如docker配置了Max 4G,-Xmx3G -XX:MaxMetaspaceSize=512m

剩余可能已经不足0.5G了,再加一部分其他消耗。此时很可能就要到90%了,稍不注意,可能会被docker强行kill掉。因此一定要注意jvm的参数配置的数据


总结:

  • -Xmx 控制的是堆内存的最大大小,不包含元空间的内存。

  • 元空间的内存 取决于类的加载情况,它在 JVM 的本地内存中,且可以通过 -XX:MaxMetaspaceSize 来限制。

  • 元空间和堆内存是两个独立的内存区域,分别用来存储对象和类的元数据。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch