OutOfMemoryError, используя Клип Ява

Решенный: Я решил его!! Я должен был увеличить размер кучи своих свойств проекта у netbeans язя, не в самой netbeans конфигурации язя

I have a game application which is very simple, I use a Clip object from javax.sound.sampled package to play a background music(an mp3 format file that is almost 9m long and 8mb in size) I converted it to a wav file and it became 87mb >_<. And I have small wav files I use for buttons. The problem is I get an OutOfMemoryError each time I terminate my program. I have made an app that imitates somewhat the same problem only if you click the short clips multiples times after clicking the long wave file first and then click terminate button to end it and then I receive that error. However I do not know how to provide the same wav files for others to try and test this sample

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);
    }
}
}
0
nl ja de
попытайтесь использовать DiskFile вместо Файла. I' m не уверенный в этом случае, но в некоторых других случаях это экономит партию памяти.
добавлено автор dinesh707, источник
Вместо того, чтобы использовать весь если заявления, который isn' t очень OO, вы могли использовать вложенные классы или новый ActionLister, затем переписать actionPerformed метод.
добавлено автор maffo, источник
@PoiXen: Спасибо за предложения (я попробую это в малых приложениях в следующий раз), но в моем реальном заявлении, у меня есть кнопка множества (для механики игры), таким образом, я использую если заявления внутри для петель в mouseClicked методе.
добавлено автор katrina, источник

2 ответы

Причина позади этого состоит в том, что ваша программа использует слишком много памяти, которая превышает размер кучи, который вы назначили (или размер по умолчанию). Утечка памяти, может также быть ответственно за это. Можно помочь Явскому Сборщику "мусора", аннулировав всю ссылку. Иначе можно установить размер кучи через -xmx256m где m = Мегабайт .

0
добавлено
Каков был размер кучи, вы ассигновали?
добавлено автор Michael Ardan, источник
То же самое как ответ выше и у меня есть тот же самый комментарий
добавлено автор katrina, источник
это - линии, который является, где я, как предполагается, изменяю heapsize?-> netbeans_default_options = "-J-client-J-Xss2m-J-Xms32m-J-XX:PermSize=32m-J-Dapple.laf.useScreenMenuBar=true-J-Dapple.awt.graphics. UseQuartz=true-J-Dsun.java2d.noddraw=true-J-Dsun.zip.disableMemoryMapping=true"->>>>, что является мной пропавшие без вести или что, я должен измениться (По тому, как я уже удалил изменение, которое я внес, который был похож this:-J-XX-MaxPermSize=500m
добавлено автор katrina, источник

пожалуйста, проверьте, что размер кучи JVM, на основе вашей .wav памяти размеров файла, ассигнованной куче JVM, не мог бы быть достаточным.

Увеличение jvm использование кучи: Ява-Xmx* * - где память - вы, может ассигновать

Кроме того, на исключении:

catch (Exception e) {
           //close `inputStream` 
          //close `clip`
}
0
добавлено
Я попробовал решение, используя это:wiki.netbeans.org/FaqSettingHeapSize но это не работало
добавлено автор katrina, источник
Я попробовал решение, используя это:wiki.netbeans.org/FaqSettingHeapSize но это не работало. Кроме того, я должен был вынуть те 2 объекта как общественный член класса, чтобы быть в состоянии закрыть его в выгоде. Что точно, который сделает к процессу? Также часть, где я добавил LineListener, является кодом, который я не полностью понимаю, но я знаю, что она решила мой OutOfMemoryError, который разбивает применение.
добавлено автор katrina, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async