2016-08-12 153 views
0

我的jdk版本是「1.8.0_40」
我的代碼是。爲什麼是這種情況gc

public class Test { 

    private static int _1M = 1024 * 1024; 

    public static void main(String[] a) { 

     byte[] b, b1, b2, b3; 
     b = new byte[2 * _1M]; 
     b1 = new byte[2 * _1M]; 
     b2 = new byte[2 * _1M]; 
     b3 = new byte[4 * _1M]; 

    } 
} 

我的運行參數是

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 

我跑我的代碼,我得到這個GC結果,

Heap 
PSYoungGen  total 9216K, used 7987K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000) 
eden space 8192K, 97% used [0x00000007bf600000,0x00000007bfdccd60,0x00000007bfe00000) 
from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000) 
to space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000) 
ParOldGen  total 10240K, used 4096K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000) 
object space 10240K, 40% used [0x00000007bec00000,0x00000007bf000010,0x00000007bf600000) 
Metaspace  used 3084K, capacity 4494K, committed 4864K, reserved 1056768K 
class space used 339K, capacity 386K, committed 512K, reserved 1048576K 

你可以看到GC結果,總內存爲12M,但我代碼只有10M.and這個代碼不運行gc。 這是爲什麼

+0

「爲什麼這個」相當流行......你能更具體地回答你的問題嗎? – alfasin

回答

1

這在幾個地方回答,例如:Java using up far more memory than allocated with -Xmxhttps://plumbr.eu/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx

長話短說:你的程序是使用堆的10M,但堆是隻能由JVM消耗的內存的一部分。 GC算法,JIT編譯器等使用了內部數據結構,這些結構甚至可以使JVM的總內存使用量增加一倍。

+0

謝謝,但爲什麼內部數據結構使用2M內存。他們可以使用固定大小嗎? – jsondream

+0

額外的內存大致與堆的大小成比例(例如:GC需要跟蹤更多的對象)。你的額外使用率(+ 20%)似乎有點高,但根據我的經驗沒有什麼不尋常的。 AFAIK除了檢查進程內存外,沒有辦法檢查JVM內部數據結構的確切內容(例如,您不能分辨GC相關數據結構使用了多少內存,以及它們是什麼)。 –

+0

非常感謝 – jsondream

相關問題