最近まで動作していた古いコードがいくつかありますが、Java SE 6 ではなく OpenJDK 6 を使用する新しいサーバーで実行されるようになったため、動作しなくなったようです。
問題は JAI.create を中心に展開しているようです。拡大縮小してpngファイルに変換するjpegファイルがあります。このコードは以前はリークなく動作していましたが、OpenJDK を実行するボックスに移動したため、ファイル記述子が閉じないように見え、サーバーの tmp ディレクトリにますます多くの tmp ファイルが蓄積されていることがわかります。これらは私が作成するファイルではないので、それを行うのは JAI だと思います。
別の理由として、新しいサーバーのヒープ サイズが大きくなっている可能性があります。JAI がファイナライズでクリーンアップしても、GC の発生頻度が低い場合は、そのためにファイルが山積みになっている可能性があります。ヒープ サイズを減らすことはできません。また、ulimit を増やすこととは関係のない問題が発生しているようです。
これを実行するとリークするファイルの例を次に示します。
/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 ファイルは私のものではないため、それらの名前が何であるかわからず、実際には何もできません。
- 画像のサイズ変更と再フォーマットに最適なライブラリは何ですか? Scalr について聞いたことがありますが、他に調べるべきことはありますか?
現時点では古いコードを書き直すのは避けたいのですが、他に選択肢がない場合は...
ありがとう!