奇怪的“java.lang.OutOfMemoryError:java堆空间”

奇怪的“java.lang.OutOfMemoryError:java堆空间”,java,image,out-of-memory,Java,Image,Out Of Memory,今天我做了一个简单的Java应用程序,只需加载一些.png文件到内存中,这些文件的总空间约为7mb,但它会产生一个奇怪的错误: 我的小命令:java-Xmx1024m-jardist/PNGImageLoader.jar 已加载图像0图像/图像\u 01000111100000011000000110100000已加载 图像1图像/图像\uu0000010101010110110100011111101加载的图像 2个图像/图像\u 010011101110011101111001000000加

今天我做了一个简单的Java应用程序,只需加载一些.png文件到内存中,这些文件的总空间约为7mb,但它会产生一个奇怪的错误:

我的小命令:java-Xmx1024m-jardist/PNGImageLoader.jar

已加载图像0图像/图像\u 01000111100000011000000110100000已加载 图像1图像/图像\uu0000010101010110110100011111101加载的图像 2个图像/图像\u 010011101110011101111001000000加载的图像3 图像/图像_010011100110010101101111加载的图像4 图像/图像_000110000011100011001011011100加载的图像5 图像/图像\u 0101001000101000010110110110加载的图像6 图像/图像\u 0110110001000000100010101111加载的图像7 图像/图像\u 010101110111010101011010100010加载的图像8 图像/图像_0111011101000010111001011101100加载的图像9 图像/图像\u 0110001011111001101110001000011加载的图像10 图像/图像\u 0001111011000111101111111111加载的图像11 图像/图像\uu00000 100111001010110101001110001加载的图像12 图像/图像\u 0100000110111011101011011加载的图像13 图像/图像\u 0110011100000001011101111001加载的图像14 图像/图像\u 0110101100000111010001100加载的图像15 图像/图像\u 00010010110100001011001111000加载的图像16 图像/图像\u 001111001110111011010101001000101加载的图像17 图像/图像\u 01111100101010111100011000110加载的图像18 图像/图像\u 0001011110101110001101101101000加载的图像19 图像/图像\u 00101000001111101100001101101101加载的图像20 图像/图像\u 0111011100000100000000001001加载的图像21 图像/图像\u 010010001010101010100000100011加载的图像22 图像/图像\u 0011011110000110011010011011001加载的图像23 图像/图像\u 00001000010010010000101001001011加载的图像24 图像/图像\u 0010111000110001110011000加载的图像25 图像/图像\u 00101100010101000011001010111加载的图像26 图像/图像\u 01111110100001011011000011010加载的图像27 图像/图像\u 00111011111100000111100000000011加载的图像28 图像/图像\u 01100110000001011111001000111101加载的图像29 图像/图像\u 010011011011111011000101000011加载的图像30 图像/图像\u 0011001011101000011111011100101加载的图像31 图像/图像\u 0011100111010001110010111101111加载的图像32 图像/图像\u 011000111011111010111110110001111加载的图像33 图像/图像\u 01000000101110000001010000011011加载的图像34 图像/图像\u 0011010100000101101100010101001加载的图像35 图像/图像\u 010011011011010 10100110111010加载的图像36 图像/图像\u 0001011101010011010001111110101加载的图像37 图像/图像\u 01011111001111010000000111000加载的图像38 图像/图像\u 001100011001111100001011001加载的图像39 图像/图像\u 011101010001111001011000000011线程中的异常 main java.lang.OutOfMemoryError:位于的java堆空间 java.awt.image.DataBufferByte.DataBufferByte.java:92 at java.awt.image.ComponentSampleModel.createDataBufferComponentSampleModel.java:415 java:941 at imageio.ImageTypeSpecifier.CreateBuffereImageTypeSpecifier.java:1073 在javax.imageio.ImageReader.getDestinationImageReader.java:2896 在 com.sun.imageio.plugins.png.PNGImageReader.readImagePNGImageReader.java:1280 在 com.sun.imageio.plugins.png.PNGImageReader.readPNGImageReader.java:1577 在javax.imageio.imageio.readImageIO.java:1448 at javax.imageio.imageio.readImageIO.java:1308 at pngimageloader.Images.loadImageImages.java:22 at pngimageloader.Images.getImageImages.java:33 at pngimageloader.Images.getAllImagesImages.java:43 at pngimageloader.pngimageloader.mainPNGImageLoader.java:15

这是我的PNGImageLoader.java类

package pngimageloader;

public class PNGImageLoader {

    public static void main(String[] args) {
        Images images = new Images();
        images.getAllImages("images/");
    }
}
下面是Images.java类

package pngimageloader;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import javax.imageio.ImageIO;

public class Images {

    HashMap images;

    Images() {
        images = new HashMap();
    }

    BufferedImage loadImage(String path) {
        try {
            return ImageIO.read(new File(path));
        } catch (Exception exception) {
            System.out.println(exception.getMessage());
            System.exit(1);
            return null;
        }
    }

    BufferedImage getImage(String path) {
        BufferedImage image = (BufferedImage) images.get(path);
        if (image == null) {
            image = loadImage(path);
            images.put(path, image);
        }
        return image;
    }

    void getAllImages(String path) {
        File files = new File(path);
        int i = 0;
        for (File file : files.listFiles()) {
            getImage(file.getPath());
            System.out.println("Loaded image (" + i + ") " + file.getPath());
            i++;
        }
    }
}
我不专业,但我觉得这很奇怪。
提前感谢您的帮助,Patrick。

正如GSP所指出的,您的小文件可以扩展到大量内存。 事情是,你很可能不应该把图像保存在内存中,几乎没有理由这样做。
只要使用一些流媒体,这取决于你想做什么。

这有什么奇怪的?您正在从内存中的磁盘加载一组图像。内存有限。因此,它抛出了一个OutOfMemoryError,因为它没有足够的内存来加载所有图像。@PerdutaPatrick 128mb是一个比人们想象的更容易打破的障碍。部分问题是PNG是一种压缩文件格式。因此,一旦加载到BuffereImage中,文件的大小(以像素为单位)可能远远大于7mb。我刚刚在photoshop中创建了一个1000x1000的纯色图像,每像素1M像素x 3字节,但PNG文件的大小只有1kb。您为整个JVM堆分配了最大128 MB。这使得图像的存储空间比您的2GB内存总量要小得多。虽然它们在PNG压缩格式的磁盘上只占用7Mbs,但它们在内存中占用的空间要多得多
y、 我的手机有1 GB的可用内存和70 GB的可用存储空间。如果您的机器在执行内存密集型测试时没有更多内存,请选择一台适合该作业的机器。