为什么是这种情况gc
问题描述:
我的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。 这是为什么
答
这在几个地方回答,例如:Java using up far more memory than allocated with -Xmx或https://plumbr.eu/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx
长话短说:你的程序是使用堆的10M,但堆是只能由JVM消耗的内存的一部分。 GC算法,JIT编译器等使用了内部数据结构,这些结构甚至可以使JVM的总内存使用量增加一倍。
“为什么这个”相当流行......你能更具体地回答你的问题吗? – alfasin