java.lang.OutOfMemoryError播放音频时出现非常奇怪的行为

java.lang.OutOfMemoryError播放音频时出现非常奇怪的行为,java,audio,out-of-memory,javasound,audio-player,Java,Audio,Out Of Memory,Javasound,Audio Player,我在这个网站上找到了一个问题,我找到了一些代码,我对这些代码做了一些修改,回答了播放音频的问题,但是当我尝试使用这些代码时,我发现了一个java.lang.OutOfMemoryError 然后我试着用2G的ram启动它,但它仍然给了我错误, 我真的不知道发生了什么我的代码如下: import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.Input

我在这个网站上找到了一个问题,我找到了一些代码,我对这些代码做了一些修改,回答了播放音频的问题,但是当我尝试使用这些代码时,我发现了一个java.lang.OutOfMemoryError

然后我试着用2G的ram启动它,但它仍然给了我错误, 我真的不知道发生了什么我的代码如下:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;


public class PlaySoundTest {

public static void main(String[] args){
    playSound("audio.wav");
}

public static synchronized void playSound(final String url){
      new Thread(new Runnable(){
        public void run(){
          try {
            Clip clip = AudioSystem.getClip();
            InputStream bufferedIn = new BufferedInputStream(new FileInputStream(new File(url)));
            AudioInputStream audioSrc = AudioSystem.getAudioInputStream(bufferedIn);
            clip.open(audioSrc);
            clip.start(); 
          }catch (Exception e){
            System.err.println(e.getMessage());
          }
        }
      }).start();
    }
}
整个stacktrace就是这个

Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1131)
at PlaySoundTest$1.run(PlaySoundTest.java:24)
at java.lang.Thread.run(Thread.java:722)
这让我很困惑,因为对我来说,这段代码看起来很好。 只是想澄清一下audio.wav的大小是1.5 MB,所以在分配了2 GB的情况下,这真的不应该是一个问题

我想可能是某个地方的内存泄漏,但我不知道为什么


如果有人能解释一下,我会很高兴。

一个较小的.wav文件会怎么样?我猜你的.wav文件目前对于你的程序来说太大了,即使是2 GB。在程序运行时,给它附加一个探查器,这样你就可以看到是什么消耗了内存。可能是这样的:即使是1.5MB?好的,我尝试使用BufferedInputStream,所以我没有全天候加载整个文件,所以我尝试使用更小的文件。好的,我试着用一个51KB的文件,同样的事情也发生了。“所以我想我需要用另一种方式来播放它”,我想是的。但我怀疑基于applet的
AudioClip
也能处理它。带有SPI的Java声音和数据流应该可以工作。我认为Java不支持32位编码。尝试以44100 fps的16位WAV,而不是22050。如有必要,您可以使用Audacity转换wav文件。我当然已经运行了超过17秒的wav,所以这不是问题所在。