Erro detectado pela JRE, mesagem java.lang.OutOfMemoryError
15 respostas
J
juliane27vieira
Ola, bom dia a todos!!!BOm, este erro esta aparecendo em um metodo que executo usando uma Timer e uma TimerTask …é uma tentativa minha para fazer com que este metodo que estou usando , seja executado a cada 3 minutos…o metodo em si, é uma thread que recebe mensagens da telnet numa BlockingQueue , e esta parte do timer , esta implementada para executar a gravação no banco dados de tempos em tempos…
Ele começa a executar, mas no console , depois de executar por um tempo, aparece esta mensagem que coloquei no assunto…
Se alguem puder me ajudar, fico grata, pois creio que esteja errando no uso da thread junto com o timer…antes de usar o timer, funcionava…
coloque o cógido dentro das tags [code] . Facilita na leitura.
lvolgarini
publicvoidrun(){Timertimer=null;while(true){try{msg=this.msgAtivo.poll(50,TimeUnit.MILLISECONDS);}catch(InterruptedExceptionex){ex.printStackTrace();}if(msg!=null){nego=msg.split("!");Stringaux=nego[0];negociacao=aux.split(":");timer=newTimer();TimerTaskcontrole=newTimerTask(){// aki vc faz a espera de 3 mins??publicvoidrun(){if(negociacao.length>2){atualizaCotacaoTelnet();}}};timer.scheduleAtFixedRate(controle,TEMPO,TEMPO);}}}
ao meu entender vc pode trocar essa parte
TimerTaskcontrole=newTimerTask(){// aki vc faz a espera de 3 mins??publicvoidrun(){if(negociacao.length>2){atualizaCotacaoTelnet();}}};
por:
try{Thread.sleep(180000);// esse tempo eh em milisegundos}catch(Exceptione){ex.printStackTrace();}
o metodo sleep() eh feito para segurar a execução de um programa por um determinado tempo em milisegundos
Att,
Lucas
J
juliane27vieira
mil desculpas , nunca havia postado codigo antes… :oops:…vou testar com as opinioes dadas por vcs…
J
juliane27vieira
Ivolgarini, na vdd, onde vc colocou a pergunta se era o lugar onde faço a espera de 3 minutos, é o metodo run da Timetask, onde queria colocar o que deve ser feito no intervalo de 3 e 3 minutos, é o metodo que coloco na timer.scheduleAtFixedRate…pelo menos, foi assim a forma que eu entendi para poder usar o agendador de tarefas da TimerTask…
J
juliane27vieira
oi, so mais uma coisa, o sleep() seguraria a execucao da thread por 3 minutos…colocando o sleep no lugar da timertask, ele apenas demora tres minutos pra executar o comando …eu preciso implementar uma forma de fazer com que este metodo execute a thread num determinado espaço de tempo…
J
juliane27vieira
publicvoidrun(){Timertimer=null;while(true){try{msg=this.msgAtivo.poll(50,TimeUnit.MILLISECONDS);}catch(InterruptedExceptionex){ex.printStackTrace();}if(msg!=null){nego=msg.split("!");Stringaux=nego[0];negociacao=aux.split(":");System.out.println("negociacao"+negociacao[0]);try{//timer = new Timer();// TimerTask controle = new TimerTask() {// public void run() {Thread.sleep(1000*60);}catch(InterruptedExceptionex){ex.printStackTrace();}if(negociacao.length>2){atualizaCotacaoTelnet();// System.out.println("MOsTRA por favor");}// }// };//timer.scheduleAtFixedRate(controle,TEMPO,TEMPO2); }}}
lvolgarini
Mais uma coisa! Naum entendi muito bem pq o sleep nao funcionaria mas blz!
Eu particularmente nao gosto de usar laço infinito, apesar q o java executa um laço infinito em 2 segundos auhuahaua.
no seu codigo eu faria o seguinte!
mais uma coisa, declare as variaveis e/ou objetos dentro do while tb
Att,
Lucas
J
juliane27vieira
entao, o sleep ai nessa posição que passei no codigo, faz com que a thread execute uma linha, dai a thread dorme, depois faz outra, enfim, eu preciso que toda a table que usa esta thread seja preenchida, dai todas as informações sao gravadas no banco…terminado isso, preciso que esta atualização pare por alguns minutos e depois retorne, assim enquanto o sistema estiver conectado…
Tentei passar o sleep para o objeto que starta esta thread, so funciona uma vez, depois nao reinicia…o erro de outofMemoryerror nao acontece mais pq nao estou mais usando a Timer nem a TimerTask…estou tentando dar sleep , mas nao esta voltando a executar a thread em seguida…
lvolgarini
Acho q entendi.
Vc vai ter q mudar, colocar seu while na classe que chama sua thread.
Mais ou menos assim:
while(true){/*Vc nunca pode dar um start() duas vezes no mesmo objeto thread, deve reinstancia-la*/sua_classe_threadobjeto=newsua_classe_thread();objeto.start();Thread.sleep(180000);//faz esse while parar por 3 minutos}
se isso nao fizer sentido passe o codigo inteiro!
Att,
Lucas
felipedamiani
java.lang.OutOfMemoryError = falta de memória!
J
juliane27vieira
Ola…entao, tentei na sexta instanciar a minha classe thread dentro da classe que a chama, mas da um erro qdo dou o new MinhaClasse , diz cannot find symbol , contructor new MinhaClasse…nesta classe thread tem parametros que sao passados dentro do metodo construtor dela…
lvolgarini
só uma pergunta.
Vc num deu new MinhaClasse()?
passa o codigo inteiro ai melhor!
Att,
Lucas
J
juliane27vieira
oi Lucas…na hora de instanciar a classe Thread, aparece o erro…
vou passar os codigos, o primeiro é no evento do botão que inicia chama a classe Thread e onde nao consegui instancia-la…(Uso o netbeans)
desta forma como esta, ele executa uma vez, e nao volta mais…como nao cosnegui instanciar a classe Thread, nao pude fazer o que vc disse pra colocar dentro de um while