OutOfMemory使用JAI读取图像

时间:2012-09-21 16:09:00

标签: java jai

在某些图像上,使用JAI时出现OutOfMemory异常。似乎JAI试图分配一个巨大的字节[],可能是由于图像中的一些错误。有没有解决方法?如果没有,有没有办法预先检测错误?这是一个例子:

URL bad = new URL("http://static4.businessinsider.com/image/505c5461ecad047a3500002b-772-598/share-of-income-to-labor.png");
RenderedOp op = JAI.create("stream", SeekableStream.wrapInputStream(url, true));
op.createInstance();

引起:java.lang.OutOfMemoryError:Java堆空间     在com.sun.media.jai.codecimpl.PNGImage.readChunk(PNGImageDecoder.java:554)     在com.sun.media.jai.codecimpl.PNGImage。(PNGImageDecoder.java:489)     at com.sun.media.jai.codecimpl.PNGImageDecoder.decodeAsRenderedImage(PNGImageDecoder.java:81)     在com.sun.media.jai.opimage.CodecRIFUtil.create(CodecRIFUtil.java:120)     在com.sun.media.jai.opimage.PNGRIF.create(PNGRIF.java:56)     ......还有20个

3 个答案:

答案 0 :(得分:1)

你是否正在使用JAI,因为你被困在旧的JDK上?标准的JDK 1.6 PNG库没有这个问题,至少对于您提供的示例图像。

例如(在Clojure中,但仍在JDK 1.6中使用Java API)

wget http://static4.businessinsider.com/image/505c5461ecad047a3500002b-772-598/share-of-income-to-labor.png
...
2012-09-21 13:14:54 (370 KB/s) - `share-of-income-to-labor.png.1' saved [64754/64754]

user=> (.exists (java.io.File. "share-of-income-to-labor.png"))
true

user=> (javax.imageio.ImageIO/read (java.io.File. "share-of-income-to-labor.png"))
javax.imageio.IIOException: Error reading PNG image data (NO_SOURCE_FILE:0)

user=> (System/getProperty "java.version")
"1.6.0_35"

答案 1 :(得分:0)

您唯一的选择是捕获错误并报告图像已损坏。

答案 2 :(得分:-1)

您可以尝试逐渐增加堆大小。如果错误仍然存​​在,则可能是由于内存泄漏。 看到这个。 http://jadroider.blogspot.com/2012/07/java-how-to-change-jvm-memory-settings.html