Утечка памяти в Java Clip (Sound / Audio) после закрытия с помощью close () - PullRequest
0 голосов
/ 30 ноября 2009

Следующий код создает новый аудиоклип, воспроизводит его, спит в течение 3 секунд, а затем закрывает его по окончании воспроизведения. Несмотря на вызов close (), я наблюдаю увеличение использования памяти jvm на размер аудиоклипа каждый раз, когда выполняется цикл while.

Я участвую в игре, написанной на языке 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);
    }
}
}

Ответы [ 2 ]

1 голос
/ 28 июля 2013
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();
            }
        }
    }
    }
0 голосов
/ 30 ноября 2009

Если вы уверены, что имеется утечка памяти, а не задержка сбора мусора, вы можете начать с закрытия и очистки всех выделенных ресурсов, удаления прослушивателя и установки всех ссылок на null. (Переместите объект File также из цикла.)

Если это не помогает, и javadocs не намекают на то, что можно очистить, вы можете запустить heapdump, чтобы увидеть, какие объекты используют память и каков их путь к корню.

...