我有ImageIcons的形式存儲在數據庫中的圖像,我想要爲我們的網頁提供服務,但是對於大圖像,我將收回內存異常。如何轉換和寫入大圖像而不會導致OOM錯誤?
這是我現在怎麼做,
[編輯]我擴大了我的ImageUtilities提供非透明的BufferedImage簡化了代碼,
BufferedImage rgbbi = ImageUtilities.toBufferedImage(icon.getImage());
ServletOutputStream out = null;
try {
// Get the Servlets output stream.
out = responseSupplier.get().getOutputStream();
// write image to our piped stream
ImageIO.write(rgbbi, "jpg", out);
} catch (IOException e1) {
logger.severe("Exception writing image: " + e1.getMessage());
} finally {
try {
out.close();
} catch (IOException e) {
logger.info("Error closing output stream, " + e.getMessage());
}
}
正在拋出的異常是下面,
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at sun.awt.image.ImageRepresentation.createBufferedImage(ImageRepresentation.java:230)
at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:484)
at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)
at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
...
有沒有一種方法,我可以重寫這個流的輸出ImageIO.write
並以某種方式限制其緩衝區大小?
[編輯] 我不能只增加堆大小或者,我需要服務的圖像是在10000x7000像素的範圍,作爲一個字節數組,工程出(10000px x 7000px x 24bits)
280MB。我認爲這是一個不合理的堆大小分配給一個servlet中的圖像轉換。
的示例圖像Large
不好意思問這個顯而易見的問題,但是您是否試圖增加堆大小或將圖像切分爲更小的塊? – kostja
@kostja我的圖像的一個例子是10368x6912像素大,壓縮其5Mb,未壓縮,我認爲在2Gb以下。另外,我怎樣才能剁一個ImageIcon? – Andrew
所以你會發送2GB的數據從服務器?如果你有這種帶寬容量,你可以承擔更多的RAM和Java堆。 –