尝试使用clip.open()打开174KB声音文件时出现Java:OutOfMemoryError

时间:2011-11-16 18:37:51

标签: java out-of-memory

我只是尝试使用javax.sound.sampled库播放声音片段,使用我在文档中找到的最基本的示例。我已经看到了几十个这样编码的例子,它们似乎都可以工作,文件只有174KB所以它不像我想要播放整个音乐会:

public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
    // TODO Auto-generated method stub
    Clip clip;
    AudioInputStream sound = AudioSystem.getAudioInputStream(new File("test.wav"));
    AudioFormat format = sound.getFormat();
    DataLine.Info info = new DataLine.Info(Clip.class, format);
    clip = (Clip)AudioSystem.getLine(info);
    clip.open(sound);
    clip.start();
}

...这会产生错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1131)
at test.main(test.java:21)

我几乎不知道造成这种情况的原因,我已经尝试增加JVM的内存限制,这根本没有帮助。我将非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

将以下内容添加到Java命令

-XX:+HeapDumpOnOutOfMemory

获取OOM后,JVM将生成二进制堆转储,您可以使用Eclipse MAT或VisualVM(JDK附带)等工具。这将显示堆中保留的数据。

答案 1 :(得分:0)

我只是查看源自异常的源,并且在此方法中它尝试分配大小的字节缓冲区

 audioInputStream.getFrameLength() * audioInputStream.getFormat().getFrameSize()

如果audioInputStream.getFrameLength()返回除-1以外的任何其他内容。因此,您的媒体文件可能会返回这些参数中的任何一个的异常值,导致此代码尝试分配非常大的内存块。我建议你检查你为你的wav文件计算的值是这样的:

AudioInputStream sound = AudioSystem.getAudioInputStream(new File("test.wav"));
System.out.println( "frame length: " + sound.getFrameLength() );
System.out.println( "frame size: " + sound.getFormat().getFrameSize() );