Java - 字节数组使用的ram是set的4倍

Mat*_*o12 2 java arrays ram

我用Java的数组玩了一下,我意识到1GB的大字节数组需要4GB的RAM.
这是我的代码(确保你有至少4GB未使用的RAM或你的PC可能冻结):

public static void main(String[] args) throws InterruptedException {
    Byte[] array = new Byte[1073741823]; // Equals 1GB

    System.out.println("Done");
    Thread.sleep(10000);
    System.out.println("Completely done");
}
Run Code Online (Sandbox Code Playgroud)

这是我的机器:
MacBook Pro(64位;运行OS X 10.9)
Java:Java SE 6(1.6.0_65-b14-462)和Java SE 7(1.7.0_45).RAM:16
使用的RAM:大约10GB

当我启动这个应用程序时,它使用4GB而不是1.我使用这些参数来启动该程序:-Xmx8g -d64.

Sco*_*ley 6

那是因为Byte是一个对象,需要足够的内存来保存对象引用.你想要原始类型的小写"字节".

  • 对于1GB的"Byte"阵列,4gb不会太小吗? (5认同)
  • @ benjamin-gruenbaum你的意思是:为什么100万个资本-B Byte数组只需要4gb而不是8gb?理论上,64位JVM上的一百万个对象引用应该需要8个字节*一百万= 8gb.但是,默认情况下,Oracle JVM的更高版本使用[Compressed Oops](https://wikis.oracle.com/display/HotSpotInternals/CompressedOops),这大大减少了内存消耗.如果通过使用`-XX:-UseCompressedOops`重新运行程序来关闭Compressed Oops,它将吸收你期望的8gb. (3认同)