java - Java Sequencer是否使用了所有内存? (7kb midi文件)

标签 java memory audio sequence midi

好的,我正在编写一个基本游戏,并决定使用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/

相关文章:

c - 为什么释放分配的数据后内存使用量没有减少?

ios - 使用自定义声音解析推送通知会播放默认声音

ios - 当应用程序进入后台时,应用程序中的 FaceID 或 touchID 是否会停止在后台播放音频?

java - JPA 持久化对象而不调用 persist

java - Spring 最好的验证码?

java - 如何从 AlertDialog onClickListener 中访问我的 Activity 实例变量?

objective-c - 系统声音通过扬声器非常安静地播放 - C,Objective-C

java - @Autowired 或@Resource 字段是单例吗?

c++ - 删除其引用在三个不同列表中维护的指针对象

Java 8 Update 60 减少可用堆内存