【问题标题】:Java: OutOfMemoryError when trying to open a 174KB sound file with clip.open()Java:尝试使用 clip.open() 打开 174KB 声音文件时出现 OutOfMemoryError
【发布时间】:2011-11-17 03:02:40
【问题描述】:

我只是尝试使用 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 的内存限制,但根本没有帮助。我将不胜感激。

【问题讨论】:

  • 您是否尝试过增加 JVM 堆大小?可能有帮助..viralpatel.net/blogs/2009/01/…
  • 这可能是一个愚蠢的问题,但是您是否在其他声音播放器中测试过该剪辑以查看它是否实际播放(即它没有损坏)?
  • 还输入System.err.println(format); 以查看实际格式。如果帧速率有点像 22Hz,你可以认为文件已损坏。

标签: java out-of-memory


【解决方案1】:

我只是查看了异常的来源,在这个方法中它试图分配大小的字节缓冲区

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

【讨论】:

  • 我实际上并没有检查文件来源。但是使用记录在不同程序中的文件似乎可以解决它。对于任何想知道我使用的是 Ubuntu 10.04 附带的默认录音机应用程序的人。
【解决方案2】:

将以下内容添加到您的 Java 命令中

-XX:+HeapDumpOnOutOfMemory

在获得 OOM 后,JVM 将生成一个二进制堆转储,您可以使用诸如 Eclipse MAT 或VisualVM(JDK 随附)之类的工具。这将向您显示堆中保留了哪些数据。

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2019-12-20
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多