3

最近まで動作していた古いコードがいくつかありますが、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;
}

私の質問は次のとおりです。

  1. 誰かがこれに遭遇して解決しましたか? 作成された tmp ファイルは私のものではないため、それらの名前が何であるかわからず、実際には何もできません。
  2. 画像のサイズ変更と再フォーマットに最適なライブラリは何ですか? Scalr について聞いたことがありますが、他に調べるべきことはありますか?

現時点では古いコードを書き直すのは避けたいのですが、他に選択肢がない場合は...

ありがとう!

4

2 に答える 2