2009-11-29 7 views
0

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

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

Не могли бы вы отформатировать код? – rsp

+0

@rsp: Отформатированный код :) – Asaph

ответ

0

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

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

+0

Я пропустил цикл около минуты и смотрел, как поднимается память и поднимается. Если это был сбор мусора, я должен увидеть память, уменьшенную в эту минуту, верно? – John

+0

Не обязательно. JVM работает только с GC, когда ему это нравится. –

+0

Это зависит от того, насколько занят остальной код, он может увеличиться на некоторое время, прежде чем вернуться. Цикл сбора мусора имеет тенденцию отображать паззл. Это нормально. Сказав, что вы можете закрыть и очистить ресурсы, которые используете. – rsp

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(); 
      } 
     } 
    } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^