Java8为Metaspace保留最少1G,尽管(最大)MetaspaceSize

Java8为Metaspace保留最少1G,尽管(最大)MetaspaceSize,java,jvm,jvm-arguments,jvm-hotspot,Java,Jvm,Jvm Arguments,Jvm Hotspot,Java8在元空间启动后保留1G空间。这意味着最小元空间大小为1G。但我将MetaspaceSize设置为300m,将MaxMetaspaceSize设置为400m。为什么Java保留的比我允许的更多 Java版本 $ java -version java version "1.8.0_45" Java(TM) SE Runtime Environment (build 1.8.0_45-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b0

Java8在元空间启动后保留1G空间。这意味着最小元空间大小为1G。但我将MetaspaceSize设置为300m,将MaxMetaspaceSize设置为400m。为什么Java保留的比我允许的更多

Java版本

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
虚拟机标志

$ jcmd 21689 VM.flags
21689:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=62914560 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1006632960 -XX:MaxMetaspaceSize=399998976 -XX:MaxNewSize=603979776 -XX:MetaspaceSize=299999232 -XX:MinHeapDeltaBytes=1048576 -XX:NativeMemoryTracking=summary -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
NMT

刚开始的时候

Total: reserved=2402748KB, committed=150796KB     

-                     Class (reserved=1056956KB, committed=7868KB)
                            (classes #1300)
                            (malloc=188KB #564) 
                            (mmap: reserved=1056768KB, committed=7680KB) 
类别(保留=1221904KB)

这不是正在使用的内存,只是虚拟地址空间

已提交=197904KB

这是197MB,不是1GB


因此,您并没有说明java实际上为类数据消耗了1GB的内存,只是它保留了1GB的地址空间。

java为类保留1G的原因隐藏在它管理压缩类指针的方式中

长答案:阅读此文档


简短回答:在“CompressedClassSpaceSize”属性中设置正确的大小-XX:CompressedClassSpaceSize=300m

我认为您显示的是Java堆总数,而不是元空间总数。我从命令结果中删除了Java堆您在哪里看到专门与元空间大小相关的1GB数字我假设是因为Java 8中的类在Metaspace中。我不对吗?是的,你是对的。这就是我的意思。对不起,英语不是我的母语。我会编辑这个主题。但它不应该保留这么多内存,因为我设置了MetaspaceSize=300m和MaxMetaspaceSize=400m。不可预知的保留是不好的。我在那个VM上有其他JMV进程,我不能启动它们是因为没有可用内存。你可以打开Overmit,让它保留那么多空间。这是一个可能的解决办法。但我想了解为什么java首先为类保留1G。我认为这可能与它需要一个连续的内存块来压缩类空间有关,你就是我们ing。有
CompressedClassSpaceSize
选项。我也喜欢关于CompressedClassSpaceSize为什么是硬限制的详细解释:
Total: reserved=2402748KB, committed=150796KB     

-                     Class (reserved=1056956KB, committed=7868KB)
                            (classes #1300)
                            (malloc=188KB #564) 
                            (mmap: reserved=1056768KB, committed=7680KB)