1

我有一个简单的问题:

下面我用随机值填充一个数组并找到最大值。我想知道我可以定义的数组的最大大小(作为命令行参数),而不会出现 OutOfMemory 异常。现在我正试图以二进制搜索的方式在大值和小值之间交替。

有更好的解决方案吗?还有..是什么决定了实际系统中的这个价值?

java Arrays 7890000 ===> 线程“main”中的异常 java.lang.OutOfMemoryError

java 数组 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);
  }
}
4

1 回答 1

2

大数组放置在tenured空间中,它是执行GC后可以分配的最长连续区域或Integer。MAX_VALUE 决定最大尺寸。如果不触发 GC,就无法知道这是什么,并且您不知道没有 OOME 会得到什么。即除非你得到一个,否则你可能会分配更多。

这个接缝就像你正在以错误的方式进行。您应该只在需要时分配内存,因此您不应该试图查看您可能获得多少不需要的内存。

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

于 2013-09-17T22:33:59.063 回答