使用Clip java时的OutOfMemoryError

时间:2013-01-29 07:05:44

标签: java out-of-memory javax.sound.sampled

解决:我解决了!!我不得不在netbeans ide中增加项目属性的堆大小,而不是netbeans ide配置本身

我有一个非常简单的游戏应用程序,我使用来自javax.sound.sampled包的Clip对象来播放背景音乐(一个长度接近9米,大小为8mb的mp3格式文件)我将它转换为wav文件,它变成87mb> _<。我有用于按钮的小wav文件。问题是我每次终止程序时都会出现OutOfMemoryError。我已经制作了一个模拟有点相同问题的应用程序,只有在首先单击长波文件然后单击终止按钮结束它然后我收到该错误时单击短片数倍。但是我不知道如何为其他人提供相同的wav文件来尝试测试这个样本

import javax.swing.*;
import javax.sound.sampled.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class ClipClass extends JPanel implements ActionListener{
private JButton longClip, shortClip1,shortClip2,quit;
public ClipClass(){
    setLayout(new GridLayout(2,2,0,0));
    longClip = new JButton("Play long wav");
    shortClip1 = new JButton("Play short wav1");
    shortClip2 = new JButton("Play short wav2");
    quit = new JButton("Terminate");
    add(longClip);
    add(shortClip1);
    add(shortClip2);
    add(quit);
    longClip.addActionListener(this);
    shortClip1.addActionListener(this);
    shortClip2.addActionListener(this);
    quit.addActionListener(this);
}
public synchronized void playSound(final String url) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                Clip clip = AudioSystem.getClip();
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(url));
                clip.open(inputStream);
                clip.start();
                clip.addLineListener(new LineListener() {
                    @Override
                    public void update(LineEvent evt) {
                        if (evt.getType() == LineEvent.Type.STOP) {
                            evt.getLine().close();
                        }
                    }
                });
            } catch (Exception e) {
            }
        }
    });
}
public static void main(String[] args){
    JFrame frame = new JFrame("SampleSoundOOME");
    ClipClass pane = new ClipClass();
    frame.setContentPane(pane);
    frame.setVisible(true);
    frame.pack();
}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==longClip){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/Trance.wav");
    }if(e.getSource()==shortClip1){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/KDE_Window_Sticky.wav");
    }if(e.getSource()==shortClip2){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/KDE_Window_Iconify.wav");
    }if(e.getSource()==quit){
        System.exit(0);
    }
}
}

2 个答案:

答案 0 :(得分:0)

这背后的原因是您的程序使用的内存太多,超出了您指定的堆大小(或默认大小)。内存泄漏也可能是造成这种情况的原因。您可以通过取消所有引用来帮助Java垃圾收集器。否则,您可以通过-Xmx256m m = Megabyte来设置堆大小。

答案 1 :(得分:0)

请检查JVM堆大小,根据您的.wav文件大小分配给JVM堆的内存可能不够。

使用以下命令增加jvm堆:java -Xmx * * - 您可以分配的内存在哪里

另外,例外:

catch (Exception e) {
           //close `inputStream` 
           // close `clip`
}