我有一個工作,直到最近,一些舊的代碼,但現在似乎BARF它運行使用的OpenJDK 6而不是Java SE的6JAI創建似乎離開文件描述符開放
這個問題似乎在新服務器上圍繞JAI.create。我有我縮放並轉換爲PNG文件的jpeg文件。這段代碼過去沒有任何泄漏,但現在移動到了運行OpenJDK的盒子,文件描述符似乎永遠不會關閉,並且我看到越來越多的tmp文件在服務器上的tmp目錄中累積。這些不是我創建的文件,所以我認爲它是JAI。
另一個原因可能是新服務器上的堆大小較大。如果JAI清理完成,但是GC發生的頻率較低,那麼也許這些文件因此而堆積如山。減少堆大小不是一種選擇,我們似乎與增加限制有關的不相關問題。
這裏是當我運行這個泄漏的文件的一個例子:
/tmp/imageio7201901174018490724.tmp
一些代碼:
// Processor is an internal class that aggregates operations
// performed on the image, like resizing
private byte[] processImage(Processor processor, InputStream stream) {
byte[] bytes = null;
SeekableStream s = null;
try {
// Read the file from the stream
s = SeekableStream.wrapInputStream(stream, true);
RenderedImage image = JAI.create("stream", s);
BufferedImage img = PlanarImage.wrapRenderedImage(image).getAsBufferedImage();
// Process image
if (processor != null) {
image = processor.process(img);
}
// Convert to bytes
bytes = convertToPngBytes(image);
} catch (Exception e){
// error handling
} finally {
// Clean up streams
IOUtils.closeQuietly(stream);
IOUtils.closeQuietly(s);
}
return bytes;
}
private static byte[] convertToPngBytes(RenderedImage image) throws IOException {
ByteArrayOutputStream out = null;
byte[] bytes = null;
try {
out = new ByteArrayOutputStream();
ImageIO.write(image, "png", out);
bytes = out.toByteArray();
} finally {
IOUtils.closeQuietly(out);
}
return bytes;
}
我的問題是:
- 有沒有人遇到這一點,解決了嗎?由於創建的tmp文件不是我的,我不知道他們的名字是什麼,因此不能對它們做任何事情。
- 調整和重新格式化圖像的選擇庫有哪些?我聽說過斯卡爾 - 我應該看看什麼?
我寧可不要在這個時候rewite的舊代碼,但如果沒有別的選擇......
謝謝!
所以在這個例子中,你明確地調用'iis.close()'並解決了這個問題? – rogerdpack
@rogerdpack唉這是很久以前,我不記得我做了什麼。我同意這似乎是答案的含義,我無法證實這是否確實是我所做的。抱歉。 – MrSilverSnorkel