1

解決済み:解決しました!! netbeans ide 構成自体ではなく、netbeans ide でプロジェクト プロパティのヒープ サイズを増やす必要がありました

私は非常に単純なゲーム アプリケーションを持っています。javax.sound.sampled パッケージの Clip オブジェクトを使用してバックグラウンド ミュージック (長さ約 9m、サイズ 8mb の mp3 形式ファイル) を再生します。これを wav ファイルに変換し、 87MBになりました>_<。そして、ボタンに使用する小さな wav ファイルがあります。問題は、プログラムを終了するたびに OutOfMemoryError が発生することです。最初に長波ファイルをクリックした後、短いクリップを複数回クリックし、終了ボタンをクリックして終了すると、そのエラーが表示される場合にのみ、多少同じ問題を模倣するアプリを作成しました。ただし、他の人がこのサンプルを試してテストするために同じ wav ファイルを提供する方法がわかりません

import javax.swing.*;
import javax.sound.sampled.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class ClipClass extends JPanel implements ActionListener{
private JButton longClip, shortClip1,shortClip2,quit;
public ClipClass(){
    setLayout(new GridLayout(2,2,0,0));
    longClip = new JButton("Play long wav");
    shortClip1 = new JButton("Play short wav1");
    shortClip2 = new JButton("Play short wav2");
    quit = new JButton("Terminate");
    add(longClip);
    add(shortClip1);
    add(shortClip2);
    add(quit);
    longClip.addActionListener(this);
    shortClip1.addActionListener(this);
    shortClip2.addActionListener(this);
    quit.addActionListener(this);
}
public synchronized void playSound(final String url) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                Clip clip = AudioSystem.getClip();
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File(url));
                clip.open(inputStream);
                clip.start();
                clip.addLineListener(new LineListener() {
                    @Override
                    public void update(LineEvent evt) {
                        if (evt.getType() == LineEvent.Type.STOP) {
                            evt.getLine().close();
                        }
                    }
                });
            } catch (Exception e) {
            }
        }
    });
}
public static void main(String[] args){
    JFrame frame = new JFrame("SampleSoundOOME");
    ClipClass pane = new ClipClass();
    frame.setContentPane(pane);
    frame.setVisible(true);
    frame.pack();
}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==longClip){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/Trance.wav");
    }if(e.getSource()==shortClip1){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/KDE_Window_Sticky.wav");
    }if(e.getSource()==shortClip2){
        playSound("C:/Users/Sony/Documents/NetBeansProjects/Sphere Break/KDE_Window_Iconify.wav");
    }if(e.getSource()==quit){
        System.exit(0);
    }
}
}
4

2 に答える 2

0

この背後にある理由は、割り当てたヒープ サイズ (または既定のサイズ) を超える大量のメモリをプログラムが使用しているためです。メモリリークもこれの原因となる可能性があります。すべての参照を無効にすることで、Java ガベージ コレクターを助けることができます。-Xmx256mそれ以外の場合は、 where m=でヒープ サイズを設定できますMegabyte

于 2013-01-29T07:11:36.657 に答える
0

.wav ファイルのサイズに基づいて、JVM ヒープ サイズを確認してください。JVM ヒープに割り当てられたメモリが十分でない可能性があります。

次を使用して jvm ヒープを増やします: java -Xmx** - 割り当てることができるメモリはどこですか

また、例外的に:

catch (Exception e) {
           //close `inputStream` 
           // close `clip`
}
于 2013-01-29T07:13:43.640 に答える