如何找到不超过VM限制的最大字节数组大小?
我尝试的是:
int size = Integer.MAX_VALUE;
byte[] request = new byte[size];
然后我收到错误:Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
背景故事是我的数据包代理丢失了数据包的一部分,因为我不知道我可以使用的最大内存大小是什么。
谢谢!
答案 0 :(得分:3)
您可以使用类似
的内容自行查找问题的答案long maxByteArraySize() {
long size = Integer.MAX_VALUE;
while(--size > 0) try {
new byte[size];
break;
} catch(Throwable t) {}
return size;
}
另请注意,您可以使用-Xmx
标志增加jvm可用的内存量,例如:java -Xmx4g MyClass
可能会让您分配(很多)比默认情况下更大的数组。
(不是我认为你想要做的事实际上是个好主意......)
答案 1 :(得分:0)
好Integer.MAX_VALUE
是2,147,483,647
;
System.out.println(Runtime.getRuntime().freeMemory());
但我不会尝试将所有内容分配给byte[]
。
答案 2 :(得分:0)
基本上arrays
被认为是java中的对象。对象存储在heap memory
上。对象是否是本地对象并不重要,但只有它的引用存储在stack memory
中。您可以通过以下方式找到max heap size
: -
java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
大约采用较小尺寸阵列。
答案 3 :(得分:-1)
在阵列中分配最大金额不太可能达到VM限制。
但是,如果内存是限制,您可以使用运行时的可用内存来计算它。
int maxSize = Math.min(Integer.MAX_VALUE - 8, Runtime.getRuntime().freeMemory());
这假设您正在使用byte
数组(对于对象),但是对于对象,您必须将最大内存除以对象大小,其中包括对象标题(4和8字节为分别为32/64位JVM。