quinta-feira, 22 de julho de 2010

Gerência de memória Java

O sistema de gestão de memória do JAVA foi desenvolvido a fim de facilitar no processo de desenvolvimento e execução das aplicações. Com esse intuito, estabeleceu-se um modelo onde o programador não se detém com questões relativas à alocação e remoção de espaço de memória para suas estruturas. Quem trata de questões de alocação e remoção de espaço é a própria máquina virtual. Para liberação de espaço, existe um mecanismo especial chamado Garbage Collector, que é um processo da máquina virtual, que varre o espaço de memória dos programas em execução a fim de encontrar objetos sem referência, e também, mover objetos entre os diversos níveis da memória, de acordo com seu tempo de vida. No modelo de gerência com Garbage Collector, pode-se citar como vantagem, o fato de livrar o programador das questões relativas à alocação e também prevenção ao vazamento de memória. Como desvantagem pode-se citar o consumo de recursos de processamento ao se executar o Garbage Collector. Dentro do sistema de classificação da gestão de memória existem vários níveis de espaços que são citados a seguir:

Eden Space: Espaço no qual é alocada a maioria dos objetos com ciclo de vida curto. Espaço pertencente ao chamado Young gen.

Survivor space: Espaço secundário, reservado a objetos que ultrapassaram o tempo de permanência no Eden Space.  Este também é pertencente ao Young gen.

Tenured gen: Espaço onde serão alocados objetos que terão tempo vida mais prolongado, que ultrapassam o limite de permanência na Young gen.

Perm gen: Espaço especial que armazena os dados de reflexão da JVM, como classes e métodos de objetos. Em JVM’s que possuem compartilhamento de dados entre classes, este espaço é dividido em duas áreas: somente leitura(red-only) e leitura/escrita (read-write).

Para acompanhar o status destas áreas de memória na máquina virtual, a JDK fornece em seu pacote de demos, um aplicativo visual. Nele é possível visualizar graficamente o nível de ocupação de cada área de memória. Pode-se encontrá-lo no seguinte caminho:

[JAVA_HOME]\demo\management\MemoryMonitor\MemoryMonitor.jar
Fontes: http://www.devmedia.com.br/articles/viewcomp.asp?comp=8625 , http://www.manageengine.com/products/applications_manager/java-runtime-monitoring.html , http://www.linhadecodigo.com.br/artigo/568/garbage-collector-e-as-armadilhas-na-performance-de-aplicacoes.aspx , http://pt.wikipedia.org/wiki/Coletor_de_lixo

terça-feira, 20 de julho de 2010

Sockets Java

A idéia aqui é montar dois programas, um cliente e um servidor, onde o cliente envia através Socket TCP a mensagem 'Ola' ao servidor, que exibe a mensagem na tela.

Um pouco sobre Sockets: Socket é a implementação de uma camada de comunicação entre pocessos que pode ser realizada através de uma rede. Em uma rede TCP/IP, um socket trabalha entre a camada de transporte e a de rede. Para o estabelecimento de um Socket, um elemento essencial é o número da porta de comunicação: é este que irá identificar quais processos estarão se comunicando. O TCP é um protocolo de comunicação confiável e para isto possui mecanismos para garantia da integridade da comunicação. A comunicação via TCP é estabelecida através de conexão, ou seja, estabelece-se um canal fechado bidirecional entre as duas partes envolvidas.

A seguir temos os códigos-fonte produzidos no desenvolvimento.

Cliente
O cliente construído recebe 2 parâmetros em sua linha de comando: host do servidor e porta de comunicação. Em seguida repassa estes dados ao instanciar a classe que irá tratar da comunicação. É passado ao método de comunicação o texto da mensagem a ser enviada. Ao final do processamento é exibida na tela uma mensagem de sucesso ou falha na comunicação.


Servidor
O servidor recebe como parâmetro da linha de comando o número da porta em que irá executar. Este dado é passdo então ao objeto da classe que executa a comunicação. Em seguida é estabelecido o Socket do servidor para a "escuta" na porta especificada. Ao receber uma conexão, o servidor "lê" da stream de entrada os bytes recebidos e os joga na tela até o fim da transmissão. Caso ocorra algum erro de comunicação, o servidor mostra uma mensagem informativa.