查找可分配的最大大小数组

时间:2013-09-17 19:56:03

标签: java arrays memory-management

我有一个简单的问题:

下面我用一个随机值填充数组并找到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);
  }
}

1 个答案:

答案 0 :(得分:2)

大数组放置在终身空间中,它是可以在执行GC或整数后分配的最长连续区域。 MAX_VALUE确定最大尺寸。没有触发GC就无法知道这是什么,你不知道没有OOME你会得到什么。即使你得到一个,你可能已经分配了更多。

这种接缝就像你走错了路一样。如果需要,你应该只分配内存,所以你不应该试着看你不需要多少内存。

如果您有64位JVM,则可以将数据存储在内存映射文件中的堆中,并且只受驱动器上可能为TB的可用空间的限制。