java - 分配字节数组以获得 40 亿位

标签 java

我正在阅读 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/

相关文章:

java - @BeforeClass 和 @AfterClass 在每次测试之前和之后调用

java - 未从 JUnit 测试加载 'application.yml' 中的 Spring Boot 属性

java - 如何使用带有 Java 的 Selenium WebDriver 获取可滚动网页的整页屏幕截图?

java - 在 SpringMVC 的上下文中,如何拥有提供同一类的不同 JSON 表示的 Web 服务?

java - 如何在不复制对象的情况下将字符串转换为 char[]?

java - 我们如何在 spring 中使用依赖注入(inject)动态加载特定类?

java - 解析嵌套的 JSON

java swing 验证文本字段

java - Netty 游戏服务器与游戏线程通信

java - 向另一台设备发送通知