Aplicação com Timer consumindo muita memoria

13 respostas
java
F

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

13 Respostas

J

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

F
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á.

F

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

J

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”.

F

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.

F

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

F

/*

  • 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

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

F

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

F
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