2009-11-29 59 views
0

以下代码创建一个新的音频剪辑,播放它,休眠3秒钟,然后在播放完毕后关闭它。尽管调用close(),但我每次运行while循环时都会观察jvm的内存使用情况,以及声音片段的大小。关闭闭合后的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 2009-11-29 21:29:38

+0

@rsp:代码格式:) – Asaph 2009-11-29 21:31:44

回答

0

如果确认存在内存泄漏,而不是一个垃圾收集延迟,你可以开始关闭和清理你分配所有资源,消除监听器和所有引用设置为null。 (将File对象也移出循环。)

如果这没有帮助,并且javadocs不提示可以清除的内容,则可以触发heapdump以查看哪些对象使用内存以及它们的路径以根为主。

+0

我让循环运行了大约一分钟,并观察记忆爬升和爬升。如果它被垃圾收集,那么我应该在那一刻看到内存减少了吗? – John 2009-11-29 21:40:38

+0

不一定。当它感觉像JVM时,JVM只运行GC。 – 2009-11-29 21:42:23

+0

这取决于代码的其余部分有多繁忙,它可能会增加一段时间,然后再回落。垃圾收集周期倾向于显示拼图模式。这很正常。话虽如此,你可能想要关闭并清除你使用的资源。 – rsp 2009-11-29 21:44:42

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