2016-08-12 144 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