0

次のコードは、新しいオーディオ クリップを作成して再生し、3 秒間スリープしてから、再生が終了したら閉じます。close() の呼び出しにもかかわらず、while ループが実行されるたびに jvm のメモリ使用量がサウンド クリップのサイズだけ増加するのを見ています。

Javaでコーディングしたゲームに参加しており、サウンドを扱っています。サウンドが再生されるたびに、使用しているメモリを増やすことはできません。

私は何が欠けていますか?

import java.io.File;
import javax.sound.sampled.*;

public class ClipLeak{

public static void main(String[] args) throws Exception{
    while(true){
        File soundFile = new File("./sound.wav");
        AudioInputStream sound = AudioSystem.getAudioInputStream(soundFile);

        DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(sound);
                    sound.close();

        clip.addLineListener(new LineListener(){
            public void update(LineEvent event){
                if(event.getType() == LineEvent.Type.STOP){
                    event.getLine().close();
                }
            }
        });

        clip.start();
        Thread.sleep(2000);
    }
}
}
4

2 に答える 2

1
Try this
    import java.io.File;
    import javax.sound.sampled.*;

    public class ClipLeak{

    public static void main(String[] args) throws Exception{
        while(true){
            File soundFile = new File("./sound.wav");
            AudioInputStream sound = AudioSystem.getAudioInputStream(soundFile);

            DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(sound);


            clip.addLineListener(new LineListener(){
                public void update(LineEvent event){
                    if(event.getType() == LineEvent.Type.STOP){
                        event.getLine().close();
                    }
                }
            });

            clip.start();
            Thread.sleep(2000);
            if (clip.isOpen()) {
             clip.close();
             sound.close();
            }
        }
    }
    }
于 2013-07-27T21:04:09.733 に答える
0

ガベージ コレクションの遅延ではなくメモリ リークがあることが確実な場合は、割り当てたすべてのリソースを閉じてクリーンアップし、リスナーを削除してすべての参照を に設定することから始めることができますnull。(Fileオブジェクトもループの外に移動します。)

それが役に立たず、javadocs が何をクリアできるかを示唆していない場合は、ヒープダンプをトリガーして、どのオブジェクトがメモリを使用しているか、およびそれらのルートへのパスが何であるかを確認できます。

于 2009-11-29T21:34:48.790 に答える