加载大量文件时出现Java ImageIO.read()OutOfMemoryError

时间:2012-08-30 04:44:11

标签: java image loading out-of-memory javax.imageio

我正在用Java编写2D游戏,但我无法将图像加载到图像处理程序中。 首先,我想说系统一直有效,直到我开始加载超过15张图像。

我有一个AnimationHandler类,它给出了图像的名称和路径,并且应该将它们加载到Animation类中并存储这些动画。我正在这样做,以便我的游戏中的每个对象实例都可以使用相同的动画而不是单独加载它们。

无论如何,我的问题是,当我尝试加载大量图像时(我会解释为什么我会在一秒内有这么多。)我得到以下错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我正在加载图片:

BufferedImage im = ImageIO.read(getClass().getResources(imgName));

我必须加载这么多图像的原因是因为a)每帧一个图像或每个动画至少一个较大的图像。 b)一些动画(例如背景)很大,所以我将这些动画的每一帧分成几部分。

根据我的看法,任何人似乎唯一得到的响应是增加JVM可用的内存量,但我还没有构建到.jar文件,而且我正在从NetBeans执行并且不执行任务我不知道如何从NetBeans内部改变它。

此外,它加载图像的方式是为每个正在加载的图像创建一个新线程。我不知道这是否会有所帮助,但有没有办法跟踪当前正在加载的图像数量,并根据该数字选择等待加载下一张图像?

任何帮助都会非常感激, 谢谢 彼得

编辑: 下面是完整的堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:59)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1263)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1560)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1374)
at Loaders.ImageLoader.loadImage(ImageLoader.java:25)
at MediaHandlers.AnimationHandler.loadAnimation(AnimationHandler.java:53)
at MediaHandlers.AnimationHandler.initAnimations(AnimationHandler.java:38)
at MediaHandlers.AnimationHandler.<init>(AnimationHandler.java:22)
at Main.PlatformGame.<init>(PlatformGame.java:90)
at Main.PlatformGame.main(PlatformGame.java:105)

1 个答案:

答案 0 :(得分:1)

更改Netbeans中的设置;

  • 右键单击主项目节点
  • 选择“属性”
  • 选择“运行”节点
  • 将您的内存要求添加到VM Options字段...即-Xms128M -Xmx1024M

关于你的装载过程。如果您还没有这样做,我会使用ExecutorService加载图片(可能是fixed thread pool服务)。

一般来说,它会使事情变得更容易管理,并且还有助于限制失控线程的数量(导致在某些时候,拥有大量线程带来的性能优势没有线程)