我有一个简单的问题:
下面我用随机值填充一个数组并找到最大值。我想知道我可以定义的数组的最大大小(作为命令行参数),而不会出现 OutOfMemory 异常。现在我正在尝试以二分搜索的方式在大值和小值之间交替。
还有更好的解决方案吗?而且......在实际系统中什么决定了这个值?
block 引用>java Arrays 7890000 ===> Exception in thread "main" java.lang.OutOfMemoryError
java Arrays 7890 ===> Max is 0.9999444707701561
public class Arrays { public static void main(String[] args ) { int N = Integer.parseInt(args[0]); //Initialize to rnadom values between 0 and 1 double[] a = new double[N]; for ( int i=0; i<N;i++) a[i] = Math.random(); //find the maximum double max = Double.NEGATIVE_INFINITY; for (int i = 0; i < N ;i++) if(a[i] > max ) max = a[i]; System.out.println("Max is "+max); } }
最佳答案
大型数组放置在tenured空间中,它是执行GC后可以分配的最长连续区域或Integer。 MAX_VALUE 确定最大大小。如果不触发 GC,就无法知道这是什么,并且您不知道如果没有 OOME,您可能会得到什么。也就是说,除非你得到一个,否则你可能会分配更多。
这看起来好像你的处理方式是错误的。您应该仅在需要时分配内存,因此您不应该尝试查看可能获得多少不需要的内存。
如果您有 64 位 JVM,您可以将数据存储在内存映射文件的堆外,并且您仅受驱动器上可用空间(可能为 TB)的限制。
关于java - 查找可分配的最大尺寸数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18858794/