Salve! Ontem tive que apresentar o que estava feito até agora no meu tcc. O problema é que justo na apresentação travou td… começo a fica lento e etc. Parei pra pensar e até faz sentido: O sistema estava rodando pelo NetBeans, tenho umas 4 escutas de sockets além de servlets emulados no glassfish do netbeans. Minha pergunta é: o que eu faço XD???
Não sei ao certo como otimizar isso, tem como juntar tudo(ou quase tudo) em um unico processo no lado servidor e fazer o mesmo no lado cliente?Alias, isso resolve?
Uma escuta em especial ocupou grande parte da memória. É um código que fiz pra monitorar os ips do cliente(com os fins mais pacíficos possíveis, garanto).´Alguem tem uma sugestão de como fazer isso ocupar menos processos? O Código está abaixo:
importjava.io.IOException;importjava.io.PrintStream;importjava.net.*;importjavax.swing.*;importjava.awt.*;classrobozinho2{publicstaticStringnovoIP="",IP="";//2staticInetAddressmeuIP,meuIPnovo;publicstaticvoidmain(Stringargumentos[]){try{//tenta pegar o IPInetAddressmeuIP=InetAddress.getLocalHost();InetAddressmeuIPnovo=InetAddress.getLocalHost();}catch(Exceptione){System.out.println("nao deu pra pegar o ip");}for(inti=0;i==0;i=i+0){// loop eternotry{for(intj=0;j<90000;j++){}// loop de temporização 2.PASSA UM TEMPOInetAddressmeuIPnovo=InetAddress.getLocalHost();novoIP=meuIPnovo.getHostAddress();// 3.Pega Ip denovoif(IP.equals(novoIP)){}else{IP=novoIP;AplicacaoDoCliente2.roda();System.out.println("monitorado com sucesso");}}//trycatch(Exceptionexcecao){System.out.println("O robo não foi capaz de monitorar seu IP.");// 9}//catch}//loop eterno}}
Percebi um fenomeno estranho. No servidor, pra cada vez que o cliente envia o IP via socket, aumenta a quantidade de memoria que o processo ocupa. Isso não deveria acontecer: ao se conectar ao socketserver, este recebe os valores e guarda no banco. Depois disso, finito. Porque consome memória? Alguem sabe como forçar a jvm tirar coisas inúteis da memória?
Obrigado ^^
felipedamiani
Cara, acho melhor fazer isso com uma thread, e dentro do run você fazer o loop infinito while (true) e não aque POG do for!
e aqui:
for(intj=0; j<90000; j++){}
pode usar um thread.sleep ou wait?!
acho que já dá uma melhorada no desempenho!
S
shamanpyro
haha, impossivel fugir do pog. Valew as dicas, mas não manjo nada de threads. Vou trocar for por while, não se se dá diferença mas blza ( na verdade acho que dá sim, pq eu não tenho que fica criando as variaveis do for o tempo todo né =/ ).
Ué… wait não é justamente um for vazio?
ivo_costa
Cara vc tem que usar Thread pq é única forma de não travar a applicação, ainda mais que vc tem um loop infinito no teu programa.
Outra coisa vc já tá fazendo o TCC e não sabe usar Threads? Threads é muito importante e se vc for programar vai usar sempre.
Segue um programa com dois botões veja que usando Thread o programa não trava mais sem usar Threads o programa vai travar:
Eu mudei o seu for infinito para while(true) e mudei o soma da variável para Thread.sleep:
importjava.awt.Dimension;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.net.*;importjavax.swing.JButton;importjavax.swing.JCheckBox;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.WindowConstants;classrobozinho2extendsJFrame{publicstaticStringnovoIP="",IP="";// 2staticInetAddressmeuIP,meuIPnovo;publicrobozinho2(){JPanelpanel=newJPanel();panel.setLayout(null);panel.setPreferredSize(newDimension(200,200));finalJButtonsem=newJButton("Sem");finalJButtoncom=newJButton("Com");com.setBounds(10,10,100,30);com.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){newThread(){publicvoidrun(){inicializa();}}.start();sem.setEnabled(false);com.setEnabled(false);}});panel.add(com);sem.setBounds(10,50,100,30);sem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){inicializa();sem.setEnabled(false);com.setEnabled(false);}});panel.add(sem);JCheckBoxcheck=newJCheckBox("Check");check.setBounds(10,90,100,20);panel.add(check);this.add(panel);this.setLocationRelativeTo(null);this.setVisible(true);this.pack();this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}privatevoidinicializa(){try{// tenta pegar o IPInetAddressmeuIP=InetAddress.getLocalHost();InetAddressmeuIPnovo=InetAddress.getLocalHost();}catch(Exceptione){System.out.println("nao deu pra pegar o ip");}while(true){// loop eternotry{Thread.sleep(2000);// loop de temporização fica 2 segundos paradoInetAddressmeuIPnovo=InetAddress.getLocalHost();novoIP=meuIPnovo.getHostAddress();// 3.Pega Ip denovoif(IP.equals(novoIP)){}else{IP=novoIP;//AplicacaoDoCliente2.roda();System.out.println("monitorado com sucesso");}}// trycatch(Exceptionexcecao){System.out.println("O robo não foi capaz de monitorar seu IP.");// 9}// catch}// loop eterno}publicstaticvoidmain(Stringargumentos[]){newrobozinho2();}}
S
shamanpyro
melhor que isso só dois disso. A proposito, meu curso é tecnico. Se fosse pelo que aprendi na escola, não saia do
System.out.println(A + " + " +B+" = "+ C); … ainda aprendi socket aqui pelo forum entre outras coisas, acho que não estou tão mal. Por outro lado, concordo com vc: threads são vitais em aplicações client-server. Só não entendo pq precisa usar em uma aplicação que está no cliente… não seria preciso no servidor?
S
shamanpyro
PQP… testei aqui! impressionante!!! diminuiu o uso da CPU de 50% pra 5% com picos de 15%… muito bom. Isso tudo só porcausa do thread(sleep)?
ivo_costa
Sim, o for usa memória e processador enquanto Thread.sleep não quase nada.
E o for infinito que vc fez tbm usa memória e processador enquanto o while true não muito.
Outra coisa, com base nesse trecho do teu código acredito que tem muitas outras bizarrices que estão trancando a aplicação. Então dá uma revisada pra ver se não acha mais coisas.
S
shamanpyro
Ok, muito obrigado :D. Aproveitando, vc acha que tem problema isso rodar invizivel? É que precisofazer uma interface para controlar componentes eletronicos na casa do cliente. Então eu preciso saber o IP dele. Sua opiniao: deixo visivel e fechável ou invisível?
ivo_costa
“que precisofazer uma interface para controlar componentes eletronicos na casa do cliente”
Isso ficou meio vago. Não entendi direito qual problema a aplicação deve solucionar.
Mas pensa assim:
–se a aplicação for fechada pelo cliente pode ocasionar problemas?
–como vc deixaria invisivel? É impossível fazer uma aplicação invisível, tudo pode ser visto nos gerenciadores de tarefas, no mesmo momento que alguém conseguir fazer uma aplicação invisível vamos ter vírus potentes por ai…
Eu acho que o melhor seria ter uma interfaze gráfica com o cliente nem que fosse apenas para mostrar o teu email e a aplicação ficasse minimizada no systray, sendo assim o usuário iria saber que tinha algo rodando e poderia fechar quando desse vontade.
S
shamanpyro
haha… deixei invizivel num método meio bruto: setVisible(false)(NAAAAAAAAAAAAAAO)… então, nas tarefas dá pra fechar.
é que eh assim: meu tcc é um sistema com interface pra controlar redes eletricas e dispositvos eletronicos remotamente. Na pratica, vc acende/apaga luzes, ventiladores, portoes eletronicos, faz funções pré-programadas, como desligar tudo( ou quase tudo… exceto geladeira, servidor…)depois de horario comercial (para emrpesas), ou 00:30( para residencias).
systray? não sei o que é… seria queles icones no canto inferior direito no ms windows? se tiver como botar lá melhor =P.
Então… eu preciso monitorar o IP da casa dele pra saber onde enviar a resposta. Mas se o cidadão fecha, o sistema não funciona e capaz de chingar ainda =PP
S
shamanpyro
Muito obrigado pela ajuda, desculpe a inexperiencia…
Qnto a pog… melhor tentar e funcionar que ficar só esperando cair do céu ^^
Obrigado =)
ivo_costa
Systray é parte inferir direita do SO onde fica os ícones de alguns programas que estão rodando em background.
Eu nunca precisei fazer nada com o systray, mas ai vai um artigo: