Java 如何获得符合 vm 限制的最大字节数组大小
Java how to get max byte array size that will fit the vm limit
如何找到不会超过 VM 限制的最大字节数组大小?
我试过的是:
int size = Integer.MAX_VALUE;
byte[] request = new byte[size];
但是我得到了错误:Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
背后的故事是我的数据包代理不断丢失数据包的部分,因为我不知道我可以使用的最大内存大小是多少。
谢谢!
嗯Integer.MAX_VALUE
是2,147,483,647
;您可以使用
确定有多少内存可用
System.out.println(Runtime.getRuntime().freeMemory());
但我不会尝试将其全部分配给 byte[]
。
基本上arrays
都被认为是java中的对象。对象存储在 heap memory
上。您的对象是否是 本地对象 并不重要,但只有它的引用存储在 stack memory
中。您可以通过以下方式找到 max heap size
:-
java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
并且大约采用较小尺寸的数组。
您可以通过类似
的方式自己找到问题的答案
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
可能会让您分配(很多)比您得到的更大的数组默认。
(并不是说我认为你正在尝试做的事情实际上是个好主意......)
如何找到不会超过 VM 限制的最大字节数组大小?
我试过的是:
int size = Integer.MAX_VALUE;
byte[] request = new byte[size];
但是我得到了错误:Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
背后的故事是我的数据包代理不断丢失数据包的部分,因为我不知道我可以使用的最大内存大小是多少。
谢谢!
嗯Integer.MAX_VALUE
是2,147,483,647
;您可以使用
System.out.println(Runtime.getRuntime().freeMemory());
但我不会尝试将其全部分配给 byte[]
。
基本上arrays
都被认为是java中的对象。对象存储在 heap memory
上。您的对象是否是 本地对象 并不重要,但只有它的引用存储在 stack memory
中。您可以通过以下方式找到 max heap size
:-
java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
并且大约采用较小尺寸的数组。
您可以通过类似
的方式自己找到问题的答案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
可能会让您分配(很多)比您得到的更大的数组默认。
(并不是说我认为你正在尝试做的事情实际上是个好主意......)