2016-08-22 44 views
3

我寫了一個程序來模擬MetaSpace OOM。但是我發現MetaSpace Size幾乎總是是Used MetaSpace的兩倍。爲什麼?爲什麼MetaSpace Size是使用MetaSpace的兩倍?

我運行我的程序,標記爲-XX:MaxMetaspaceSize=50m,程序拋出OOM時Used MetaSpace達到約25M而不是50M,爲什麼?

enter image description here

+1

可能的重複[如何測量Hotspot的Metaspace中的碎片?](http://stackoverflow.com/questions/32117471/how-do-i-measure-fragmentation-in-hotspots-metaspace) – the8472

回答

1

我認爲以下兩個實驗將解釋什麼是做二手元空間平均元空間大小之間的差距:

EXP-1:每類加載器加載一個類,我得到這個: enter image description here

EXP-2:load five clas每一個classloader SES,我得到這個: enter image description here

由於Java 8 document說:

空間從OS請求,然後分成塊。類加載器爲它的塊中的元數據分配空間(塊被綁定到特定的類加載器)。

我認爲這意味着一大塊通常可以包含多個類,所以元空間大小的使用率增長爲您加載每一個classloader更多的類。

java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000 

注意

您可以通過使用命令運行code here重新出現在結果確認所有的類加載不應該出現在CLASSPATH(通常包括當前目錄),或這些類將由APPClassLoader加載,而不是定製的ClassLoader。

0

問得好;-)

看一看這個美麗的好文章。

PermGenSpace vs MetaSpace

+0

如果您認爲該鏈接回答這個問題,你應該在你的回答中總結你的發現,而不是發佈只有鏈接的答案。 – assylias

+0

是的你是對的,但我正在等我的智能手機上寫這個在我的智能手機上......打字這是可怕的。 – Rainer

+0

你也是對的,它並沒有真正回答這個問題。愚蠢的我......我在一年前將這篇文章弄紅了,並確定它解釋了這種行爲。但它只記錄它。 – Rainer

相關問題