【发布时间】:2019-03-25 00:38:01
【问题描述】:
我正在用 java 编写简单的程序来创建 2 个 10 亿大小的 int 数组。 我用 -Xms10G 运行这个程序,即 10GB 内存仍然出现 OOM 错误。 下面是sn-p。
public class TestBigIntArraySize {
public static int arraySize = 1000_000_000;
public static int [] firstArray = new int[arraySize];
public static int [] secondArray = new int[arraySize];
public static void main(String[] args) {
System.out.println(1000_000_000 * Integer.SIZE);
}
}
据我所知,用于 10 亿个 int 数组的内存是 System.out.println(1000_000_000 * Integer.SIZE); 它返回小于 2GB 的 1,935,228,928。所以我的程序总要求最大为 4GB。
即使我在方法调用中创建数组并返回数组或静态(如下所示)或在 main() 内,也会出现错误。 它工作所需的内存是 12G,是我预期的 3 倍。 我正在使用 oracle java:jdk1.8.0_201
我尝试了选项 -Xms10G -XX:NewRatio=1 --- 有效。
但我想进一步减少内存占用。
我尝试了通过-Xms9G -XX:NewRatio=0.5 为伊甸园提供更多内存的选项,但 java 抱怨参数非法。
我尝试了通过-Xms9G -XX:NewRatio=1 -XX:PretenureSizeThreshold=10000 直接将数组分配给旧代的选项。但这也会给OOM。
这只是一个实验项目,我只是在适当地操作数组。我想在尽可能小的内存中进行。 有人可以建议如何去做吗?有哪些 java 选项,为什么?
【问题讨论】:
-
1,935,228,928 的输出无效,因为结果大于 maxint。如果您更改为 long (1000_000_000L),则结果为 32,000,000,000。
-
我太不听话了!! ..谢谢..
标签: java jvm out-of-memory jvm-arguments