java - 查找可分配的最大尺寸数组

标签 java arrays memory-management

我有一个简单的问题:

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

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

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/

相关文章:

java - 如何从 Android 执行 HTTPS POST?

java - java中时间戳字符串转时间戳

java - Android SDK 管理器中的 MIPS 系统镜像是什么?

c++ - vector<double> 比 double* : why? 快

linux-kernel - 我可以在内核模块中的指定物理地址分配内存页吗?

java - 如何将JDialog存储在JOptionPane创建的JDialog对象中

arrays - 如何使用循环生成的数组作为数据帧中的列来创建数据帧

Java - 在构造函数中初始化数组

objective-c - Objective-C 中 int 数组实例变量中的奇怪值

c++ - 是否保证堆分配的 block 地址不会(隐式地)改变?