O que seria esse erro?

7 respostas
S

Eu estava rodando o meu programa, e depois mais ou menso de 2 horas rodando ele da o seguinte erro:

Exception in thread "Thread-3" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.(String.java:21
at java.lang.String.(String.java:216)
at java.lang.StringBuffer.toString(StringBuffer.java:585)
at com.jacob.com.ROT.addObject(ROT.java:187)
at com.jacob.com.JacobObject.(JacobObject.java:61)
at com.jacob.com.Dispatch.(Dispatch.java:259)
at com.jacob.com.Variant.toVariantDispatch
at com.jacob.com.Variant.toVariantDispatch(Native Method)
at com.jacob.com.Variant.toDispatch(Variant.java:656)
at net.sf.jiffie.IHTMLTable.getRow(IHTMLTable.java:85)
at mmk.mmminterface.MMMInterface$Conecta.run(MMMInterface.java:275)

Alguem tem alguma ideia do que seria esse erro? E se sim como concerta-lo?

O meu codigo é o seguinte:

package mmk.mmminterface;

import java.io.*;
import java.util.*;
import java.text.*;
import net.sf.jiffie.*;

public class MMMInterface extends javax.swing.JFrame {

    /** Creates new form MMMInterface */
    public MMMInterface() {
        initComponents();
        new Conecta().start();


    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPasswordField1 = new javax.swing.JPasswordField();
        jTextField1 = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jTextField2 = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jTextField3 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Monkey Money Maker 1.0");
        setAlwaysOnTop(true);
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        jLabel1.setText("LOGIN");

        jLabel2.setText("SENHA");

        jButton1.setText("CONECTA");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });

        jButton2.setText("OFF");
        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton2MouseClicked(evt);
            }
        });

        jButton3.setText("ON");
        jButton3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton3MouseClicked(evt);
            }
        });

        jTextField2.setEditable(false);
        jTextField2.setFont(new java.awt.Font("Tahoma", 0, 28));
        jTextField2.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        jTextField2.setText("0");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
        jLabel3.setForeground(new java.awt.Color(102, 102, 102));
        jLabel3.setText("P&L");

        jTextField3.setBackground(new java.awt.Color(255, 0, 0));
        jTextField3.setEditable(false);
        jTextField3.setFont(new java.awt.Font("Tahoma", 1, 18));
        jTextField3.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        jTextField3.setText("OFF");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel3)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE)
                        .addComponent(jPasswordField1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 69, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextField3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGap(30, 30, 30))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 57, Short.MAX_VALUE)
                    .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 57, Short.MAX_VALUE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 57, Short.MAX_VALUE))
                .addGap(3, 3, 3)
                .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(22, 22, 22))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2)
                        .addContainerGap())))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
        conectado = true;
    }                                     

    private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {                                      
        ligado = true;
        jTextField3.setText("ON");
        jTextField3.setBackground(new java.awt.Color(0, 163, 0));
    }                                     

    private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
        ligado = false;
        jTextField3.setText("OFF");
        jTextField3.setBackground(new java.awt.Color(255, 0, 0));
    }                                     

    class Conecta extends Thread {

        public void run() {

            try {
                while (!conectado) {
                }

                if (conectado) {

                    //Declaraçao das Matrizes das Ofertas
                    int mofc[][];
                    mofc = new int[6][4];
                    int mofv[][];
                    mofv = new int[6][4];
                    int cont1;
                    int cont2;
                    //Declaracao dos IEs
                    InternetExplorer k = new InternetExplorer();
                    InternetExplorer k2 = new InternetExplorer();
                    //Inicia os IEs
                    k.setVisible(true);
                    k2.setVisible(true);
                    //Instancia a Data
                    Date time = new Date();

                    k.navigate("https://wtr.bmf.com.br/Autenticacao/SMLoginIBroker.fcc?TYPE=33554433&REALMOID=06-0ea14422-cef7-4d33-b467-0734805081ef&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Rlq1KK%2bTjmanrmkO%2bWkztYGagAIeD0fRFWN4cb08AryeECePlRWNZcA%2b3YdN0qOL&TARGET=$SM$HTTPS%3a%2f%2fwtr%2ebmf%2ecom%2ebr%2fnegociacao%2facompanhamento_de_mercado%2fcotacoes%2fcotacaoAllBook%2easp%3fempresa%3dCD%26instrumento%3dwinj09");
                    k.waitWhileBusy();
                    IHTMLDocument2 document = k.getDocument(true);

                    k2.navigate("https://wtr.bmf.com.br/Autenticacao/SMLoginIBroker.fcc?TYPE=33554433&REALMOID=06-0ea14422-cef7-4d33-b467-0734805081ef&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Rlq1KK%2bTjmanrmkO%2bWkztYGagAIeD0fRFWN4cb08AryeECePlRWNZcA%2b3YdN0qOL&TARGET=$SM$HTTPS%3a%2f%2fwtr%2ebmf%2ecom%2ebr%2fnegociacao%2facompanhamento_de_mercado%2fcotacoes%2easp%3fempresa%3dCD%26ativo%3dwinj09");
                    k2.waitWhileBusy();
                    IHTMLDocument2 document2 = k2.getDocument(true);

                    IHTMLInputElement input = (IHTMLInputElement) document.getElementByName("USER");
                    input.setValue("meu user");
                    k.waitWhileBusy();
                    IHTMLInputElement input2 = (IHTMLInputElement) document.getElementByName("PASSWORD");
                    input2.setValue("minha senha");
                    k.waitWhileBusy();
                    IHTMLFormElement form = (IHTMLFormElement) document.getElementByName("LoginSM");
                    form.submit(true);
                    k.waitWhileBusy();

                    IHTMLInputElement input3 = (IHTMLInputElement) document2.getElementByName("USER");
                    input3.setValue("Meu user");
                    k2.waitWhileBusy();
                    IHTMLInputElement input4 = (IHTMLInputElement) document2.getElementByName("PASSWORD");
                    input4.setValue("minha senha");
                    k2.waitWhileBusy();
                    IHTMLFormElement form2 = (IHTMLFormElement) document2.getElementByName("LoginSM");
                    form2.submit(true);
                    k2.waitWhileBusy();

                    File ofertas = new File("C://Ofertas.txt");
                    PrintStream escrever = new PrintStream(new FileOutputStream(ofertas, true));
                    File nlinhas = new File("C://nlinhas.txt");

                    int cont = 0;

                    String time2;

                    while (true) {

                        if (ligado) {
                            k.refresh(true);
                            k2.refresh(true);
                            k2.waitWhileBusy();
                            k.waitWhileBusy();
                            IHTMLFrameElement frame = (IHTMLFrameElement) document2.getElementById("fmeLeft");
                            IHTMLDocument2 frameDocument = frame.getDocument(true);
                            ElementList tab2 = frameDocument.getElementListByTag("table");
                            IHTMLTable tabe = (IHTMLTable) tab2.get(0);
                            ElementList tab = document.getElementListByTag("table");

                            int i = 2;

                            IHTMLTable ofc = (IHTMLTable) tab.get(5);
                            IHTMLTable ofv = (IHTMLTable) tab.get(8);
                            k.waitWhileBusy();
                            BufferedReader in = new BufferedReader(new FileReader(nlinhas));
                            String snl;
                            snl = in.readLine();
                            int nl = Integer.parseInt(snl);
                            time = new Date();
                            time2 = new SimpleDateFormat("HH mm ss").format(time);

                            cont2 = 2;
                            cont1 = 0;
                            while (cont1 <= 4) {
                                mofc[cont1][0] = 1;
                                mofc[cont1][1] = Integer.parseInt(ofc.getRow(cont2 + cont1).getCell(3).getInnerText());
                                mofc[cont1][2] = Integer.parseInt(ofc.getRow(cont2 + cont1).getCell(4).getInnerText().replace(".", ""));
                                while (cont2 + cont1 <= ofc.getRowCount() - 1 && Integer.parseInt(ofc.getRow(cont2 + cont1).getCell(4).getInnerText().replace(".", "")) == Integer.parseInt(ofc.getRow(cont2 + cont1 + 1).getCell(4).getInnerText().replace(".", ""))) {
                                    cont2 = cont2 + 1;
                                    mofc[cont1][0] = mofc[cont1][0] + 1;
                                    mofc[cont1][1] = mofc[cont1][1] + Integer.parseInt(ofc.getRow(cont2 + cont1).getCell(3).getInnerText());
                                }
                                cont1 = cont1 + 1;
                            }
                            cont2 = 2;
                            cont1 = 0;
                            while (cont1 <= 4) {
                                mofv[cont1][0] = 1;
                                mofv[cont1][1] = Integer.parseInt(ofv.getRow(cont2 + cont1).getCell(3).getInnerText());
                                mofv[cont1][2] = Integer.parseInt(ofv.getRow(cont2 + cont1).getCell(4).getInnerText().replace(".", ""));
                                while (cont2 <= ofv.getRowCount() - 1 && Integer.parseInt(ofv.getRow(cont2 + cont1).getCell(4).getInnerText().replace(".", "")) == Integer.parseInt(ofv.getRow(cont2 + cont1 + 1).getCell(4).getInnerText().replace(".", ""))) {
                                    cont2 = cont2 + 1;
                                    mofv[cont1][0] = mofv[cont1][0] + 1;
                                    mofv[cont1][1] = mofv[cont1][1] + Integer.parseInt(ofv.getRow(cont2 + cont1).getCell(3).getInnerText());
                                }
                                cont1 = cont1 + 1;
                            }




                            escrever.print(time2 + " ");
                            escrever.print(tabe.getRow(0).getCell(0).getInnerText().substring(47, 53) + " ");
                            i = 0;
                            while (i <= 4) {

                                //escrever.print(ofc.getRow(i).getCell(3).getInnerText() + " " + ofc.getRow(i).getCell(4).getInnerText() + " ");
                                escrever.print(mofc[i][0] + " " + mofc[i][1] + " " + mofc[i][2] + " ");

                                i = i + 1;
                            }
                            i = 0;
                            while (i <= 3) {

                                //escrever.print(ofv.getRow(i).getCell(3).getInnerText() + " " + ofv.getRow(i).getCell(4).getInnerText() + " ");
                                escrever.print(mofv[i][0] + " " + mofv[i][1] + " " + mofv[i][2] + " ");

                                i = i + 1;

                            }


                            // escrever.println(ofv.getRow(21).getCell(3).getInnerText() + " " + ofv.getRow(21).getCell(4).getInnerText());
                            escrever.println(mofv[4][0] + " " + mofv[4][1] + " " + mofv[4][2] + " ");

                            nl = nl + 1;
                            PrintStream escrever1 = new PrintStream(new FileOutputStream(nlinhas, false));
                            escrever1.println(nl);
                            cont = cont + 1;

                        //this.sleep(3000);
                        }
                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                MMMInterface mmm = new MMMInterface();
                mmm.setIconImage(mmm.getToolkit().getImage("C://monkey.gif"));
                mmm.setVisible(true);

            }
        });
    }
    public static boolean ligado = false;
    public static boolean conectado = false;

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPasswordField jPasswordField1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField3;
    // End of variables declaration                   
}

7 Respostas

T

Alguma coisa está vazando memória no seu programa.

Perguntas:

  • Tudo que você abre, fecha depois de usar? (Por exemplo, a PrintStream que vi você abrir, não vi você fechar). Não culpe o Garbage Collector porque não é atribuição dele fechar arquivos que você abriu; a responsabilidade é sua, na verdade. Ele pode até fechar alguns arquivos, mas é mais ou menos como a faxineira recolher a roupa suja que você deixou largada pela casa; ela até faz isso, mas uma vez por semana.

  • Alguma coisa que você usa precisa chamar algum método especial (Dispose, Close, Release, Finalize ou coisa com nome parecido) depois de usar?

Confira tudo isso, corrija tudo, e depois tente novamente.

C

Talvez vc esteja manipulando um arquivo cujo tamanho extrapola o tamanho da memória heap da maquina virtual.
Aumente o tamanho de sua memória, ou como a resposta acima, veja se não há algo errado com seu arquivo.

[]'s,

P

cuidado com a codificação

linha 221: while (true) {

e esse outro da linha 164

while (!conectado) {

}

S

Entao eu relamente nao estou fechando o arquivo, mas eu vou continuar usando ele aberto, tipo vou continuar gravando textos nesses arquivos. o tamanho do arquivo acho que depois dessas 2 horas ele deve estar com uns 300k. Mas entao e tooricamente o programa deveira ficar rodando por umas 8 horas e ele para no final da segunda. Ele demora usn 7 segundos para dar o refresh nos dois IE, ou seja ele escreve uma linha no txt a cada 7 segundos. Voce acha que eu deveria fechar e abrir os txt a cada ciclo? Por que ele vai continuar esando eles. Se bem que um dos arquivos eu fico alternando entre ler e escrever e nenhum momento eu fecho eles. Bom alguem tem alguma ideia? E como que eu aumento a memoria heap da maquina virtual?

Vlew Se ficou meio confuso é so falar!

rmendes08

Na hora de executar o seu programa você especifica o tamanho inicial do heap e o tamanho máximo com as opções -Xms e -Xmx do comando java.

Bem, eu dei uma passeada pelo seu código. Acho que eu não fui o único que sentiu dificuldade de lê-lo, mas enfim. Acho que só aumentar o tamanho do heap pode fazer o seu programa rodar mais alguns minutos, mas é bem provável que você tenha que melhorar a sua programação.

Efetivamente, você não escreve no arquivo a cada 7s. Tudo isso é mandado para um buffer em memória que é esvaziado quando você fecha o arquivo ou chama flush(). Além disso, existe um trecho do código em que você abre um BufferedReader dentro de um loop while(true). É bem provável que isso esteja matando o programa.

Geralmente, quando precisamos gravar dados em arquivos, banco de dados, etc. 1: processa-se todos os dados em memória ; 2: abre-se o arquivo ; 3: grava-se os dados ; 4 - fecha-se o arquivo. Acho que você será mais feliz assim. Além disso, o seu código roda em uma thread separada, também acho que você esteja tendo problemas com a concorrência.

Um bom começo é separar o código que você escreveu do código gerado pela IDE. Isso vai ajudar bastante outras pessoas a lerem o seu código (pra você ter uma idéia, legibilidade de código é tão importante que na empresa onde eu trabalho teremos um processo apenas para revisar e formatar código-fonte. Perdi uma semana de trabalho com código mal-feito, que se o meu supervisor tivesse visto teria mandado eu jogar fora e começar o módulo do zero)

S

Bom vo trabalhr em colocar comentarios pelo menso para ficar uma coisa mais auto-explicativa. Quanto a aorganizaçao, eu sempre fui bem desorganisado haha. Voces nao e viram programando em C e C++. Mas de qualquer modo eu não trabalho com isos nem irei trabalhr como foco em programacao. Eu vou tentar mudar tambem essar parte de feixar e vrir o arquivo, mas sim o program efetivamente escreve a cada 7 seg pq da para ver ja que a primeira parte dele eh o horario em que escreveu. e comparando entre uma linah e outro tem quase sempre 7 seg. Mas que seja, tem alguma chance de ser uma limitacao do meu computador?
VLEW!!

rmendes08

isso não tem nada a ver, o que está escrito no arquivo é horário em que os dados foram escritos no buffer, acredite.

Criado 20 de fevereiro de 2009
Ultima resposta 21 de fev. de 2009
Respostas 7
Participantes 5