2009-11-29 21 views
0

Le code suivant crée un nouveau clip audio, le joue, dort pendant 3 secondes et le ferme quand il a fini de jouer. Malgré l'appel de close(), je regarde l'utilisation de la mémoire du jvm augmenter de la taille du clip sonore à chaque fois que la boucle while est exécutée. Je participe à un jeu codé en Java, et je gère le son. Je ne peux pas avoir la mémoire que j'utilise augmenter chaque fois qu'un son est joué.Clip Java (son/audio) Fuite de mémoire après la fermeture avec close()

Qu'est-ce qui me manque?

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

Pourriez-vous formater le code? – rsp

+0

@rsp: Code formaté :) – Asaph

Répondre

0

Si vous êtes sûr qu'il ya une fuite de mémoire et non une poubelle recueillir retard, vous pourriez commencer avec la fermeture et le nettoyage de toutes les ressources que vous allouez, en supprimant l'auditeur et la mise en toutes les références à null. (Déplacez également l'objet File hors de la boucle.)

Si cela ne vous aide pas et que les javadocs n'indiquent pas ce qui peut être effacé, vous pouvez déclencher un heapdump pour voir quels objets utilisent la mémoire et quel est leur chemin root est.

+0

J'ai laissé la boucle tourner pendant environ une minute et j'ai regardé la mémoire monter et grimper. Si c'était la collecte des ordures, je devrais voir la mémoire réduite le long de cette minute, n'est-ce pas? – John

+0

Pas nécessairement. La JVM ne fait tourner le GC que quand cela lui convient. –

+0

Cela dépend de l'activité du reste du code, il peut augmenter pendant un moment avant de redescendre. Le cycle de collecte des ordures tend à afficher un motif de puzzle. C'est normal. Cela dit, vous pourriez vouloir fermer et effacer les ressources que vous utilisez. – 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(); 
      } 
     } 
    } 
    }