-1

リモートサーバー(HttpConnectionおよびInputStream)からBufferedImagesを作成するためにループでImageIO.read(InputStream is)を使用しています

しかし、毎回メモリJavaヒープスペースが不足します。

なぜこれが起こるのかわかりません。

これは私の jvm パラメータ オプションです。

-verbosegc -XX:+PrintGCDetails -Xmx1024m - XX:PermSize=128m

および完全な gc ログ。

[Full GC [PSYoungGen: 506K->0K(6656K)] [PSOldGen: 963K->1457K(5504K)] 1469K-
>1457K(12160K) [PSPermGen: 8556K->8556K(131072K)], 0.0155080 secs]

[Full GC [PSYoungGen: 480K->0K(11072K)] [PSOldGen: 5001K->4697K(11456K)]
5481K->4697K(22528K) [PSPermGen: 18222K->18222K(131072K)], 0.0350780 
5481K->secs]

ご覧のとおり、younggen と oldgen、permgen に空き領域があります。これは最後の完全な gc ログです。

ロギング後、メモリ不足で jvm がシャットダウンします。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.awt.color.ICC_Profile.getData(ICC_Profile.java:1315)
        at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:762)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:610)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:561)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:316)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:438)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:554)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:940)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:924)
        at javax.imageio.ImageIO.read(ImageIO.java:1400)
        at javax.imageio.ImageIO.read(ImageIO.java:1322)

助けてください。ありがとう。

私の質問で申し訳ありません。

ソースを掲載しました。画像からハッシュコードを抽出します。

1.メインコード。

HashExtractor h = new HashExtractor();
while(rs.next()) {
   Inputstream is = getStream(); 
   h.doSomething(is);
   //something to do using bi.
   is.close();
}

//in HashExtractor
public String doSomething(InputStream is) {
   BufferedImage bi = ImageIO.read(is);
   String hash = "";
   //extract hash.  

   return hash;
}

簡単に見えるように、いくつかの詳細を削除しました。(接続を取得する..など)

ありがとう!

4

1 に答える 1

3

BufferedImage読み取り後にを操作する代わりに、 ImageReaderfor を取得し、 を使用しImageReadParamてレンダリング サイズを設定します。その他、画像の読み取り中に実行するように説得できることは何でもします。そうすれば、メモリ内にイメージの複数のコピーが作成されることはありません。

于 2012-08-24T05:05:43.337 に答える