1

これは私の前のスレッドとは異なるため、新しい質問を作成しました。私は今、問題がより正確であることを知っています。

新しい bytearrayoutputstream を作成します

ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

特にない。次に、画像を書き込むと、このように

ImageIO.write(image, "gif", byteArray);

メモリは、日食ではなく「現実」で最初に100 mbのように増加します。その後、そのストリームまたは別のストリームに新しいイメージを書き込むたびに、ゆっくりと増加します!!

しばらくすると動作しなくなり、クラッシュします。

フラッシュ、リセット、すべてを閉じようとしましたが、それでもメモリリークが発生します。byteArray の使用を停止するか、それを null にするときに、メモリから離れたいと思います。

System.gc();

この場合は役に立ちません。

私とあなたが知る必要がある他の何かを助けてください。私は答えます。戻って返信してください:)

4

4 に答える 4

0

別のByteArrayOutputStreamの質問に投稿した同様の回答を参照してください。

ByteArrayOutputStreamには、バッファーを縮小できるメソッドはありません。リセットすると、バッファ内の位置が変更されます。

あなたのための解決策は

  1. コンストラクターを使用して、使用する前にバッファーのサイズを指定します。ストリームに大きなオブジェクトを書き込む場合、これにより多くのメモリが節約され、OOM例外が防止されます。
  2. BAOSオブジェクトを再利用する場合は、resetを呼び出します。これにより、バッファの先頭から次の書き込みが開始されます。
  3. メモリを解放する唯一の方法は、メモリへのすべての参照を削除することです。上記のコードでは、byteArray=nullと言います。
于 2012-11-28T14:41:21.810 に答える
0

あなたがしていることは何の意味もありません。画像をメモリから取り出して、今度はバイト配列としてメモリに入れます。

その画像をファイルに入れるか、ネットワーク経由で送信する必要があります。または、コピーを保持するだけの場合は、ここで説明したようにイメージをコピーします (バイト配列ではありません!): Object.clone() の使用におけるバグ

于 2012-10-26T15:43:37.940 に答える
0

これを試しましたか:

 try{
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ImageIO.write(image, "png", baos);
  baos.flush();
  byte[] imageBytes = baos.toByteArray();
  baos.close();
}catch(Exception ex){
  System.out.println(ex.getMessage());
}
于 2012-08-14T18:09:12.213 に答える
0

使用パターンは次のようになります。

while( keepRunning) {
     ByteArrayOutputStream byteArray = new ByteArrayOutputStream();   
     ImageIO.write(image, "gif", byteArray);
}

JVM がガベージを収集できるよりも速くこれを行うと、最終的に非常に長い GC 一時停止または OutOfMemory 例外が発生します。

于 2012-08-14T17:58:32.807 に答える