在某些图像上,使用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个
答案 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