2009-11-29 2 views
0

다음 코드는 새 오디오 클립을 만들고 재생 한 다음 3 초 동안 대기 한 다음 재생이 끝나면 닫습니다. close()에 대한 호출에도 불구하고 while 루프가 실행될 때마다 jvm의 메모리 사용량이 사운드 클립의 크기만큼 올라간 것을보고 있습니다.close()로 닫은 후의 Java Clip (사운드/오디오) 메모리 누수

나는 자바로 코딩 된 게임에 참여 중이며 사운드를 처리 중입니다. 나는 사운드가 재생 될 때마다 내가 사용하는 메모리를 늘릴 수 없다.

무엇이 누락 되었습니까? 메모리 누수가 아니라 쓰레기가 확실 지연을 수집하는 경우

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 객체도 루프 밖으로 이동하십시오.)

만약 도움이되지 않고 javadoc에서 지울 수있는 것을 암시하지 않으면 힙 덤프를 트리거하여 어떤 객체가 메모리를 사용하고 어떤 경로를 사용하는지 확인하십시오 뿌리가있다.

+0

약 1 분 동안 루프를 돌리고 메모리가 올라가고 등반하는 것을 보았습니다. 가비지 수집되는 경우, 그 분 오른쪽에 따라 메모리가 축소 표시해야합니까? – 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(); 
      } 
     } 
    } 
    }