在某些图像上,当我使用JAI时,我得到了一个OutOfMemory异常。似乎JAI正在尝试分配一个巨大的byte[],可能是由于图像中的一些错误。有什么变通方法吗?如果没有,有没有办法预先检测到错误?下面是一个示例:
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();原因: com.sun.media.jai.codecimpl.PNGImage.readChunk(PNGImageDecoder.java:554) at com.sun.media.jai.codecimpl.PNGImage.(PNGImageDecoder.java:489) at com.sun.media.jai.codecimpl.PNGImageDecoder.decodeAsRenderedImage(PNGImageDecoder.java:81) at com.sun.media.jai.opimage.CodecRIFUtil.create(CodecRIFUtil.java:120) at com.sun.media.jai.opimage.PNGRIF.create的Java堆空间(PNGRIF.java:56) ...还有20多个
发布于 2012-09-22 01:22:50
你使用JAI是因为你被旧的JDK卡住了吗?标准的JDK1.6PNG库没有这个问题,至少在您给出的示例图像中没有这个问题。
例如(在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-22 00:10:58
您唯一的选择是捕获错误并报告映像已损坏。
发布于 2012-09-22 00:40:27
您可以尝试逐渐增加堆大小。如果错误仍然存在,则可能是由于内存泄漏。看看这个。http://jadroider.blogspot.com/2012/07/java-how-to-change-jvm-memory-settings.html
https://stackoverflow.com/questions/12534169
复制相似问题