我寫了一個程序來模擬MetaSpace OOM。但是我發現MetaSpace Size
幾乎總是是Used MetaSpace
的兩倍。爲什麼?爲什麼MetaSpace Size是使用MetaSpace的兩倍?
我運行我的程序,標記爲-XX:MaxMetaspaceSize=50m
,程序拋出OOM時Used MetaSpace
達到約25M而不是50M,爲什麼?
我寫了一個程序來模擬MetaSpace OOM。但是我發現MetaSpace Size
幾乎總是是Used MetaSpace
的兩倍。爲什麼?爲什麼MetaSpace Size是使用MetaSpace的兩倍?
我運行我的程序,標記爲-XX:MaxMetaspaceSize=50m
,程序拋出OOM時Used MetaSpace
達到約25M而不是50M,爲什麼?
我認爲以下兩個實驗將解釋什麼是做二手元空間平均元空間大小和之間的差距:
EXP-2:load five clas每一個classloader SES,我得到這個:
由於Java 8 document說:
空間從OS請求,然後分成塊。類加載器爲它的塊中的元數據分配空間(塊被綁定到特定的類加載器)。
我認爲這意味着一大塊通常可以包含多個類,所以元空間大小的使用率增長爲您加載每一個classloader更多的類。
java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000
注意:
您可以通過使用命令運行code here重新出現在結果確認所有的類加載不應該出現在CLASSPATH
(通常包括當前目錄),或這些類將由APPClassLoader加載,而不是定製的ClassLoader。
可能的重複[如何測量Hotspot的Metaspace中的碎片?](http://stackoverflow.com/questions/32117471/how-do-i-measure-fragmentation-in-hotspots-metaspace) – the8472