Opniões sobre código

4 respostas
xdraculax

Ae pessoal, tenho a seguinte situação:

Um código Java meu fica esperando em um socket por mensagens XML vindas de um Hardwre com C.
Bem, esse meu socket está consumindo muitos recursos; mesmo que eu resete todos os recuros que eu utilizei. Gostaria da opnião de vocês quanto ao design do código, e se está tecnicamente correto:

try {
					ServerSocket serverSocket = new ServerSocket(30204);
					Socket connection = null;
					StringBuffer conteudo = new StringBuffer();
					int character;

					while (true) {

						try {

							System.out.println("#Log: esperando mensagens no Socket: " + serverSocket.getLocalSocketAddress());
							connection = serverSocket.accept();
							BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
							InputStreamReader isr = new InputStreamReader(is);

							while ((character = isr.read()) != 13) {
								conteudo.append((char) character);
							}
							
							System.out.println("Memória disponível: " + (Runtime.getRuntime().freeMemory() / 1000 ));
							
 					
							logarMensagem(conteudo.toString());
							
							conteudo.delete(0, conteudo.length());
							isr.close();
							is.close();
							connection.close();
							//System.out.println();
							
						} catch (Exception ex) {
							System.out.println("#Log: Recebeu uma mensagem do RSControle e ecorreu um erro: \n" + conteudo);
							//TODO: Tratar a exception e persistir.
						}
					}

Eu estou monitorando o consumo de memória pelo método Runtime.getRuntime().freeMemory(), não sei se é uma maneira descente de fazer isso - é apenas para teste.
Gostaria de saber se estou usando as classes certas.
Desde já, obrigado!

4 Respostas

eltonads

Já tentou monitorar o consumo usando JConsole? Me ajudou bastante quando tive esse mesmo tipo de necessidade.

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

R

apliquei o codigo, mas falta um metodo.

logarMensagem(conteudo.toString());

[color=red]C:\Documents and Settings\raghyjose\Testes2\src\strings\Testa.java:53: cannot find symbol

symbol  : method logarMensagem(java.lang.String)

location: class strings.Testa

logarMensagem(conteudo.toString());

1 error

FALHA NA EXECUÇÃO (tempo total: 11 segundos)[/color]

tem como eu ver este método, gostaria de entender o que este programa faz… ?

visite meu site, tem uns codigos la, de jogo de poker, calculadora e jogo de memoria.
valeu.

xdraculax

raghy:

tem como eu ver este método, gostaria de entender o que este programa faz… ?

visite meu site, tem uns codigos la, de jogo de poker, calculadora e jogo de memoria.
valeu.

Cara, esse socket recebe um XML, que é transformado em um objeto pelo XStream (que serve exatamente para isso, transforma XML em objeto e objeto em XML). Depois disso vai para a persistência, que insere os dados do objeto no banco.

Eu não coloquei o resto do código por não ser relevante ao problema em questão.

WellingtonRamos

eltonads:
Já tentou monitorar o consumo usando JConsole? Me ajudou bastante quando tive esse mesmo tipo de necessidade.

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html


Há o JVisualVM também. E vc pode fazer profiling de objetos em memória (visualizando quais estão consumindo mais a memória), de CPU (tempo que um método está gastando), etc.

Bastante útil também.

Aliás, creio que ambos possam forçar o GC a atuar para realmente ver o que está ficando. (Se usar a JVisualVM, ao iniciar a aplicação, antes do ponto onde começa a subir o consumo de memória force o uso do GC e crie um Snapshot, após um tempo, force novamente o GC e crie outro Snapshot. Com os Snapshots criados, utilize a JVisualVM para compará-los e assim terá um relatório de diferenças no decorrer do tempo).

Qto ao codigo, tente o seguinte:
Tire os objetos is e isr do Loop e os instancie onde estão mesmo (dentro do loop) como fez com o objeto connection.

Após fechar o isr e o is, se quiser, atribua a eles null.
As chamadas a close(), onde estão localizadas não garantem que os Stream serão fechados se uma exceção ocorrer antes de suas respectivas chamadas.
Coloque-os no bloco finally com try-catches distintos.

Criado 31 de março de 2010
Ultima resposta 31 de mar. de 2010
Respostas 4
Participantes 4