好的,我正在编写一个基本游戏,并决定使用MIDI声音,因为与MP3相比它们很小。我还决定使用它,因为Java托管它自己的API,而不必使用第三方包含。
但是,当我运行单个MIDI文件(通常约为7000个字节)时,我的应用程序的可用内存耗尽,以至于它经常可以暂停/中断甚至引发异常。
我的实现是
private class Track {
private Sequencer sequencer;
private Sequence sequence;
private int id;
private boolean loop;
public Track(final int id, final byte[] buffer, final boolean loop) throws IOException, InvalidMidiDataException, MidiUnavailableException
{
this.id = id;
this.sequence = MidiSystem.getSequence(new ByteArrayInputStream(buffer));
this.sequencer = MidiSystem.getSequencer();
this.loop = loop;
}
public synchronized boolean destroy()
{
this.id = -1;
this.sequencer = null;
this.sequence = null;
this.loop = false;
return this.sequencer == null;
}
public synchronized boolean play() throws InvalidMidiDataException, MidiUnavailableException
{
return play(loop);
}
public synchronized boolean play(boolean loop) throws InvalidMidiDataException, MidiUnavailableException
{
if(sequencer != null && sequencer.isRunning())
sequencer.stop();
sequencer.open();
sequencer.setSequence(sequence);
sequencer.setLoopCount(Integer.MAX_VALUE);
sequencer.start();
return sequencer.isRunning();
}
public synchronized boolean stop()
{
if(sequencer != null && sequencer.isRunning())
sequencer.stop();
return sequencer != null && !sequencer.isRunning();
}
public synchronized boolean playing()
{
return sequencer != null && sequencer.isRunning();
}
}
此刻,我从应用程序中删除了所有与图形渲染相关的内容,以检查是否没有泄漏,但这是造成问题的原因。
它实际上仅用了70MB的Ram来存储一个7000字节的文件,甚至可能吗?
要检查有多少可用内存,我只是在画画。
graphics.drawString("Free: " + Runtime.getRuntime().freeMemory(), 10, 35);
感谢您的任何帮助,将不胜感激。
最佳答案
经过研究,我发现停止同步器后需要使用“close”方法来停止使用内存。
关于java - Java Sequencer是否使用了所有内存? (7kb midi文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547277/