2015-07-10 94 views
0

我有一个Java应用程序加载1GB音乐文件播放,但由于可用RAM并不多,因此会发出OutofMemory错误。它适用于尺寸小于600 mb的小文件(当我将最小和最大可用内存分别设置为512mb和1536mb时也是如此)。我正在使用2GB RAM机器在Java中增加虚拟内存

我需要知道是否可以使用我的硬盘存储器代替RAM(由于存储限制)。如果是的话,可否请参考文章以供参考。

我使用此代码串流音乐:

DataLine.Info info = new DataLine.Info(Clip.class, format, size); 
audioStream.read(audio, 0, size); 

audioClip = (Clip) AudioSystem.getLine(info); 
audioClip.addLineListener(this); 
audioClip.open(format, audio, 0, size); 

请评论,如果我失去了一些东西。

+4

为什么不从磁盘流式传输音乐文件,而不是将所有内容加载到RAM中? –

+0

我已经添加了正在使用的代码。请告知我是否缺少东西 – lakshay

+0

您使用的是Windows还是Mac? –

回答

2

这是更好地流只是音乐,而不是

http://www.codejava.net/coding/how-to-play-back-audio-in-java-with-examples

创建从给定的声音文件的AudioInputStream: 文件AUDIOFILE =新的文件(audioFilePath);

AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); 

获取音频格式,并创建一个DataLine.Infoobject:

AudioFormat format = audioStream.getFormat(); 

DataLine.Info info = new DataLine.Info(Clip.class, format); 

获取剪辑:

Clip audioClip = (Clip) AudioSystem.getLine(info); 

打开的AudioInputStream并开始播放:

audioClip.open(audioStream); 

audioClip.start(); 

关闭并发布e资源获取:

audioClip.close(); 

audioStream.close(); 
+0

我想我使用的是同样的方法。我甚至试图在最后关闭流,但它并没有帮助,因为该文件甚至没有得到播放 – lakshay

+0

它很难帮助你,当你不确定你的问题是什么 –

+0

看来,剪辑是导致这个问题。使用SourceDataLine播放可以解决此问题,如http://www.codejava中所述。net/coding/how-to-play-back-audio-in-java-with-examples – lakshay

0

您可以这样做,它被称为虚拟内存或页面文件。

由于您使用的是Windows,你会想去:

控制面板 - 系统和安全 - 系统 - 高级系统设置 - 性能 - 高级选项卡

然后您应该看到一个用于更改可用虚拟内存量的选项。


这具有重大的缺点,因为内存是专门设计的内存,它是相当快的,所以你不会得到你的硬盘内存相同的性能。在资源意义上,更好的选择是流式传输音频,然后以这种方式操作,如果这是一个选项。

+0

没有什么区别。我认为我的代码在其他地方存在泄漏。虽然,我有一个问题。当我加载1 GB文件在我的应用程序中播放时。它在RAM还是虚拟内存上运行? – lakshay

+0

@lakshay它可能在RAM上运行,因为你没有看到性能的变化。你在使用IDE吗?如果是这样的话,那么你可以谷歌如何允许从该IDE运行该程序时使用更多的内存。例如在Eclipse中,您可以运行配置,然后更改VM参数。您可以将'-Xmx2048M'放入虚拟机参数中以允许更多的堆空间。 – Tresdon

+0

试过了。该文件被播放但不正确。该文件的第二秒会在大约5秒内播放。 – lakshay