我有一个简单的问题:
下面我用一个随机值填充数组并找到Max。我想知道我可以定义的数组的最大大小(作为命令行参数),而不会得到OutOfMemory异常。现在我正试图以二进制搜索的方式在大值和小值之间交替。
有更好的解决方案吗?而且..在实际系统中决定这个价值的是什么?
java Arrays 7890000 ===> 线程“main”中的异常java.lang.OutOfMemoryError
java Arrays 7890 ===>最大值为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);
}
}
答案 0 :(得分:2)
大数组放置在终身空间中,它是可以在执行GC或整数后分配的最长连续区域。 MAX_VALUE确定最大尺寸。没有触发GC就无法知道这是什么,你不知道没有OOME你会得到什么。即使你得到一个,你可能已经分配了更多。
这种接缝就像你走错了路一样。如果需要,你应该只分配内存,所以你不应该试着看你不需要多少内存。
如果您有64位JVM,则可以将数据存储在内存映射文件中的堆中,并且只受驱动器上可能为TB的可用空间的限制。