你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
元空间(Metaspace)所占的内存不包括在 -Xmx 配置的堆内存范围内,但它仍然会消耗系统的内存。
-Xmx:用于配置堆内存的最大值(即 JVM 用于存储对象的内存区域),它不包括 元空间。
元空间(Metaspace):JVM 的类元数据存储区域,存储类的结构信息、常量池等数据。从 JDK 8 开始,元空间取代了原来 PermGen(永久代)的角色。元空间的内存不再使用堆内存,而是直接使用本地内存(Native Memory)。
堆内存:由 -Xms 和 -Xmx 配置,存储 Java 对象。
元空间:存储类元数据、方法元数据等,不受 -Xmx 限制,可以根据需求动态扩展。默认情况下,元空间的最大内存是没有明确限制的,但可以通过 -XX:MaxMetaspaceSize 来设置其最大值。
堆内存(Heap Memory):用于存储应用程序的对象实例。
元空间(Metaspace):用于存储类的元数据,不受 -Xmx 限制。它默认位于本地内存中。
-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 来限制。
元空间和堆内存是两个独立的内存区域,分别用来存储对象和类的元数据。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!