Aplicação com Timer consumindo muita memoria

13 respostas
java
Felipe_Martins1

Tenho uma aplicação com timer e esta consumindo muita memoria, consome ate que para de funcionar, oque devo fazer ?

13 Respostas

j-menezes

Poderia colocar a parte especifica do Timer que esta consumindo muita memoria ?

Felipe_Martins1
File file;
    File afile[];
    File arq;
    File arqn;

    try {

        file = new File("D:\\sistema\\exporta");
        afile = file.listFiles();
        
        int i = 0;

        for (int j = afile.length; i <= 20; i++) {

            File arquivos = afile[i];

            ArquivoNome = arquivos.getName();

            SetQuery q = new SetQuery();

            DAO.DAOParticipantes DAOPart = new DAO.DAOParticipantes();

            String SQL = q.LerTXT_Query(0, ArquivoNome);

            arq = new File ("D:\\sistema\\exporta\\" + ArquivoNome);
            arqn = new File("D:\\sistema\\exporta\\z" + ArquivoNome);

            if (DAOPart.RetonaQTDClientes(SQL) == 1) {

                SQLQuery.append(q.LerTXT_Query(1, ArquivoNome) + "\r\n");

                DAOPart.AlteraDAOParticipantes(q.LerTXT_Query(1, ArquivoNome));

                if (RetornoSQL == true) {

                    arq.delete();

                } else {
                    arq.renameTo(arqn);
                }

            } else {

                if (DAOPart.RetonaQTDClientes(q.LerTXT_Query(0, ArquivoNome)) < 1) {

                    SQLQuery.append(q.LerTXT_Query(2, ArquivoNome) + "\r\n");

                    DAOPart.SalvarDAOParticipantes(q.LerTXT_Query(2, ArquivoNome));

                    if (RetornoSQL == true) {

                        arq.delete();
                    } else {
                        arq.renameTo(arqn);
                    }
                }
            }
        }

        SQLQuery.setText("");

    } catch (Exception ex) {
    } finally {
        
    }
C

Imagino que essa “travada” seja porque o que você fez ainda está sendo executado.
Ou você sem querer entrou em um loop infinito.
Experimente fazer uma Thread para executar isto.

C

int j = afile.length; i <= 20; i++ <— acho que tá aqui seu laço infinito…

Você declara J e incrementa o I. o for nunca se acabará.

Felipe_Martins1

Poisé eu tambem pensei nisso mais aparentemente não e

j-menezes

Nesse caso somente com debug mesmo, mas uma rotina como essa e’ sempre bom colocar em background dentro de uma Thread. Caso ela ja’ esteja voce pode tentar “jvisualvm”.

Felipe_Martins1

Tentei com uma Thread não deu certo ainda

S

O Timer é pra executar esta função? Operações IO consomem muito processamento, ou melhor, travam o processamento.

A aplicação é JavaEE? Você pode considerar utilizar componentes @Schedule.

Felipe_Martins1

Ultilizei ja fiz uma thread e não para de subir ate estourar o limite

Felipe_Martins1

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package view;

import java.io.File;
import javax.swing.JOptionPane;

/**
*

  • @author Administrador
    */

public class magica extends Thread{

public static boolean RetornoSQL = false ;

public void run()
{   
    File file;
    File afile[] = null;
    File arq;
    File arqn;
    String ArquivoNome;    
 
    try {
     
      //  timer1.stop();
        file = new File("c:\\sistema\\exporta");
        afile = file.listFiles();
        
         int i = 0;
        
         for ( i= 0 ; i <= afile.length; i++) 

        // for(i = 0; i < afile.length; i++)
           {
        
            File arquivos = afile[i];

            ArquivoNome = arquivos.getName();

            SetQuery q = new SetQuery();

            DAO.DAOParticipantes DAOPart = new DAO.DAOParticipantes();

            String SQL = q.LerTXT_Query(0, ArquivoNome);

            arq = new File ("c:\\sistema\\exporta\\" + ArquivoNome);
            arqn = new File("c:\\sistema\\exporta\\z" + ArquivoNome);

            if (DAOPart.RetonaQTDClientes(SQL) == 1) {

               // SQLQuery.append(q.LerTXT_Query(1, ArquivoNome) + "\r\n");

                DAOPart.AlteraDAOParticipantes(q.LerTXT_Query(1, ArquivoNome));

                if (RetornoSQL == true) {

                    arq.delete();

                } else {
                    arq.renameTo(arqn);
                }

            } else {

                if (DAOPart.RetonaQTDClientes(q.LerTXT_Query(0, ArquivoNome)) < 1) {

               //     SQLQuery.append(q.LerTXT_Query(2, ArquivoNome) + "\r\n");

                    DAOPart.SalvarDAOParticipantes(q.LerTXT_Query(2, ArquivoNome));

                    if (RetornoSQL == true) {

                        arq.delete();
                    } else {
                        arq.renameTo(arqn);
                    }
                }
            }
            
           
        }

     //   SQLQuery.setText("");

    } catch (Exception ex) {
      JOptionPane.showMessageDialog(null,ex);
    } finally {
    }
}

}

j-menezes

Esse tipo de erro e’ mesmo terrível pra encontrar. Mas você tem certeza que é dessa rotina que esta causando o estouro da memoria ?

Você verificou o tamanho do arquivo de leitura em relação a memoria disponivel, talvez precisa paginar, bom to chutando, mas você não é primeiro que ocorre esse tipo de coisa e tão pouco será o ultimo.

Tem que ter paciencia e analisar item por item com o debug e você encontrará o problema.

Mas quando você fala de estouro de memoria voce esta recebendo a mensagem de OutOfMemory exception ? se for, tenta aumentar o -Xms32M -Xmx1024M

Felipe_Martins1

Poise j-menezes não e este erro não eu vou te manda amanha dizendo o erro correto so pra vc entender
eu tenho varios arquivos txt dentro deles tem tres query um select e um insert e um update, então leio o select que esta na linha 1 do arquivo se tiver dados eu executo Update se não insert, estou fazendo uma especie de monitor que pega dados de um bd de uma aplicação Clipper e atraves do txt que a aplicação clipper cria eu leio e enseiro no MySQL então meu loop gira em torno disso vai pegando um a 1 lendo e excluindo

Felipe_Martins1
Exception in thread "Thread-2" java.lang.InternalError: O processo atual usou todos os identificadores de sistema 
 permitidos para objetos do Gerenciador do Windows.
    
 at sun.awt.windows.WToolkit.eventLoop(Native Method)
 at sun.awt.windows.WToolkit.run(WToolkit.java:306)
 at java.lang.Thread.run(Thread.java:748)CONSTRUÇÃO
 PARADA (tempo total: 4 minutos 42 segundos)
Criado 17 de julho de 2017
Ultima resposta 18 de jul. de 2017
Respostas 13
Participantes 4