1

在某些图像上,使用 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:com.sun.media.jai.codecimpl.PNGImage.(PNGImageDecoder.java) 处 com.sun.media.jai.codecimpl.PNGImage.readChunk(PNGImageDecoder.java:554) 处的 Java 堆空间:489) 在 com.sun.media.jai.opimage.CodecRIFUtil.create(CodecRIFUtil.java:120) 在 com.sun.com.sun.media.jai.codecimpl.PNGImageDecoder.decodeAsRenderedImage(PNGImageDecoder.java:81)。 media.jai.opimage.PNGRIF.create(PNGRIF.java:56) ... 20 更多

4

3 回答 3

1

您是否因为卡在旧的 JDK 上而使用 JAI?标准的 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"
于 2012-09-21T17:22:49.503 回答
0

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

于 2012-09-21T16:10:58.030 回答
0

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

于 2012-09-21T16:40:27.173 回答