JAVA 当 运行 通过图像文件时,For 循环 运行 内存不足

JAVA For Loop running out of memory when running though image files

我正在加载大约 100 个 3000x2000 像素的 FITS 图像,然后将每个图像的像素值转换为矩阵并重新缩放矩阵并将每个图像添加到一个 SET。

但是我的堆内存很快 运行耗尽。 一组 int 矩阵不应该占用太多内存吗? (我相信堆大约是 2GB,至少 eclipse 在给出错误之前使用了 2GB。)

所以我的想法是,每个新的 Fits 对象都在每次循环后存储在内存中。但在循环结束后不再需要它,所以我不知道为什么会这样。

有没有一种方法可以避免 运行内存不足?每次程序 运行.

时会有不同数量的 Fits 文件
Public Set<int[][]> rescaleFitsList(File[] fitsFileList){

    Set<int[][]> rescaledFitsSet = new HashSet();

     for(File fits: fitsFileList){
         Fits f = new Fits(fits);
         double bScale = f.getHDU(0).getBScale;
         double bLinear = f.getHDU(0).getBLinear;
         short[][] counts = (short[][])f.getHDU(0).getKernel();
         int[][] rescaledFits = new int[counts.length][counts[0].length];

            for(int i =0, i<counts.length, i++){
                for(int j =0, j<counts[0].length, j++){
                    rescaledFits[i][j] = (int)(bScale * counts[i][j] + bLinear); 
                 }
             }
        rescaledFitsSet.add(rescaledFits);
      }

}

在 Eclipse 中启动的应用程序有自己的 JRE(否则 System.exit(0) 也会杀死 Eclipse IDE)和自己的 VM 设置(不同于 Eclipse [=27] =]).所以 确保在 launch/run 配置中设置 -Xmx运行 > 运行 配置...:参数 选项卡:VM 参数 字段。

100 张 3000x2000 图像,每个像素一个 int(4 字节)= 100 x 3,000 x 2,000 x 4 字节 = 2,400,000,000 字节 ≈ 2.2 GB。 2 GB 的内存可能不够,但 3 GB 应该可以:-Xms3g -Xmx3g