我正在阅读 Laakman 的这本书,名为 Cracking the Coding Interview。这部分是她(作者第 202 页)所做的:
byte[] bitfield = new byte [0xFFFFFFF/8];//there are 7 F's
她正在分配 40 亿比特。但是,不是 0xFFFFFFF = 2^28-1 吗?因此,她只分配了一个2^28-1/8字节的字节数组,离40亿比特还差得很远。它只有 2^28-1 位。我的问题是——是她错了还是我做错了什么?我们如何分配 40 亿比特?我试过:
byte[] bitfield = new byte[0xfffffff *2];
虽然以上导致jvm用完堆空间。
当我们这样做时,最好的方法是表达十六进制值?例如0xffffffff 还是 0xFFFFFFFF?
最佳答案
我不清楚为什么要乘以 2。最简单的方法是采用 (40 亿/8) 的十六进制表示形式 - 其中“40 亿”实际上是指 0x100000000。
因此使用 0x100000000/8,即 0x2000000:
byte[] array = new byte[0x20000000];
如果您在启动时为 JVM 提供了足够的内存,那么应该没问题,例如与 -Xmx900M。
示例代码:
public class Test {
public static void main(String[] args) {
byte[] bytes = new byte[0x20000000];
}
}
默认运行:
c:\Users\Jon\Test>java Test
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Test.main(Test.java:3)
运行多一点空间:
c:\Users\Jon\Test>java -Xmx900M Test
关于java - 分配字节数组以获得 40 亿位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945098/