繁体   English   中英

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

背景故事是我的数据包代理保持丢失数据包的一部分,因为我不知道我可以使用的最大内存大小是多少。

谢谢!

您可以通过类似的方式自己找出问题的答案

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可能会让您分配(很多)比默认情况下更大的数组。

(不是说我认为你想要做的事实际上是个好主意......)

Well Integer.MAX_VALUE2,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

并且大约采用更小尺寸的阵列。

在阵列中分配最大数量将不太可能达到VM限制。

但是,如果内存是限制,您可以使用运行时的可用内存来计算它。

int maxSize = Math.min(Integer.MAX_VALUE - 8, Runtime.getRuntime().freeMemory());

这假设您正在使用byte数组(您是),但是对于对象,您必须将最大内存除以对象大小,其中包括对象标头(分别为32/64位JVM的4和8字节) 。

请参阅https://stackoverflow.com/a/8381338/3308999

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM