gpt4 book ai didi

Java -Xmx 命令没有给我预期的内存

转载 作者:行者123 更新时间:2023-11-29 03:36:59 26 4
gpt4 key购买 nike

我正在使用 java -Xmx60g 命令运行以下代码。

每个阵列应该在 8.5GB 左右,总共 17GB。该机器总共有 64GB,其中有 63GB“免费”。它打印 DONE DECLARING RIVER HANDS 1,表明它已完成第一个数组的声明。

但是我在线程“主”java.lang.OutOfMemoryError 中得到异常:Java 堆空间在第二个数组的声明期间。我很困惑,因为我的理解是 -Xmx60g 应该分配 60GB,而数组只使用 17GB

在此先感谢您的帮助!

long NUM_RIVER_HANDS = 2428287420L;
int half_river = (int)(NUM_RIVER_HANDS/2);
byte[][] river_hands_1 = new byte[half_river][7];
System.out.println("DONE DECLARING RIVER HANDS 1");
byte[][] river_hands_2 = new byte[(int)(NUM_RIVER_HANDS - half_river)][7];
System.out.println("DONE DECLARING RIVER HANDS 2");

最佳答案

在第一个分配中,您创建了 1214143710 个数组,每个数组都是 7 个字节加上对象开销。如果我们假设一个 16 字节数组的每个对象的开销(这是合理的,如果不是保守的话)那么这意味着 三分之二 的空间被浪费了。如果我们假设每个数组总共有 24 个字节,那么第一次分配就是 ~29GB ...如果有更多的开销,则将每个数组推到 32 个字节,例如,它是 ~38GB,此时它是难怪你不能做两次 :)

只需更改您使用数组的方式即可使这很多更有效率:

// Names changed to follow Java naming conventions
byte[][] riverHands1 = new byte[7][halfRiver];
byte[][] riverHands2 = new byte[7][(int)(NUM_RIVER_HANDS - halfRiver)];

您还需要更改使用数组的方式,但现在您总共有 14 个 byte[] 对象,每个对象都非常大...但由于对象开销,您几乎不会浪费任何内存。

关于Java -Xmx 命令没有给我预期的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14982758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com