我有一个工作,直到最近,一些旧的代码,但现在似乎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