2016-03-08 36 views
0

我有一個當前的系統在我的遊戲中有一個AudioPlayer類,它擁有AudioChannels。我不斷收到堆轉儲(這是我看着與MAT)和朝導演:在沒有內存泄漏的Java播放音頻

com.sun.media.sound.DirectAudioDevice$DirectClip.open(Unknown Source) 

在MAT泄漏看起來是這樣的:

127 instances of "com.sun.media.sound.DirectAudioDevice$DirectClip", loaded by "<system class loader>" occupy 754,011,696 (94.80%) bytes. 

Biggest instances: 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xcc5e9f18 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xce3cf970 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xdf62fc58 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xdf741840 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2b7b968 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2b7f2a0 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c80678 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c844a8 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe59e1d18 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xec186a20 - 30,427,248 (3.83%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xcc5ea388 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xcc654850 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe1502670 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2b7bdd8 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2b7f688 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c80ae8 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c84890 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe4363c68 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xeab00030 - 23,556,720 (2.96%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xcc5eb828 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xcc655cf0 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe14965f8 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe1503b10 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2b7d5c0 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c7edb8 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2c827c8 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe2cf37c8 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xe7746aa0 - 23,049,840 (2.90%) bytes. 
•com.sun.media.sound.DirectAudioDevice$DirectClip @ 0xee91fae0 - 23,049,840 (2.90%) bytes. 

我不知道該怎麼正在發生,因爲我盡我所能卸下Clip和AIS。

這是我用來播放音頻代碼:

try { 
    AudioInputStream ais = AudioSystem.getAudioInputStream(FileReader.getFile(s)); 
    clip = AudioSystem.getClip(); 
    clip.open(ais); 
    loaded = true; 

    FloatControl g = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
    g.setValue((float)(g.getMinimum() + ((double)(g.getMaximum() - g.getMinimum()) * volume))); 

    if (loops) { 
     clip.loop(Clip.LOOP_CONTINUOUSLY); 
    } else { 
     clip.start(); 
    } 

    ais.close(); 
    clip.drain(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

回答

1

您不關閉您的音頻剪輯。只要你是自由的,並且能夠,你應該儘量關閉它們:

if (clip.isOpen()) { 
    clip.close(); 
} 

顯然,這可能需要您做更多的工作來跟蹤剪輯(S)的生命週期,所以你可以確信,他們可以以對您的應用程序有意義的方式發佈。

參見:

+0

這是否解決您的問題,@Tyler賴特? –