Gerenciamento de Memoria.  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
giovanni_stiwes
JavaGuru

Membro desde: 20/04/2006 09:00:42
Mensagens: 236
Offline

Estou usando um monitor de memoria na minha aplicação e vejo os seguintes "problemas":

1 - O total de memoria mostrado pelo java é diferente da quantidade de memoria mostrada pelo processo java.exe.

2 - O Garbage coletor só está coletando, quando a memoria livre está quase no fim, e em algumas vezes ele da estouro de memoria.

3 - O tópico 2 (acima) só acontece se eu não chamar o System.gc() manualmente.

Se alguem tiver explicações eu agradeço.
[MSN]
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

1- A discrepância é grande? Senão o que está mostrando é a memória disponível dentro do alocado do processo java.exe.
2 e 3- O garbage collector não tem obrigação de rodar em nenhum momento, ele não tem tempo para rodar e você não pode exigir que ele rode. Quando chamas System.gc(), você sugere que ele execute, pode executar ou não. E ele pode estar colentando os objetos só no fim da memória porque pode ser que os objetos não foram marcados ainda para a coleta, então o GC nem toca neles.

Até!

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Pode ser que você tenha de passar alguma opção para alterar o algoritmo usado pelo Garbage Collector.

Isso já é um pouco complicado e depende da versão do seu JDK, assim como o fornecedor (por exemplo, as opções para a JVM da Sun são diferentes das opções da IBM e da BEA).

Outra coisa: será que não estão sendo usados muitos objetos que implementam o método "finalize"? Se isso estiver ocorrendo, muitos deles só são limpos a cada 2 vezes que o garbage collector efetua uma "full garbage collection".
[WWW]
giovanni_stiwes
JavaGuru

Membro desde: 20/04/2006 09:00:42
Mensagens: 236
Offline

maquiavelbona wrote:1- A discrepância é grande? Senão o que está mostrando é a memória disponível dentro do alocado do processo java.exe.

A discrepancia é variavel, quanto mais memoria alocada, maior a discrepancia.

Estou Usando Win XP e Sun Java 6.
Já que eu não posso controlar o GC como evitar o eutouro de memoria?
[MSN]
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

Podes começar por aqui:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
http://java.sun.com/javase/technologies/hotspot/index.jsp

Se estiver criando muitos objetos dentro de um loop, procure reaproveitá-los ou liberá-los quanto antes, utilize tipos menos complexos de dados, quando a thread estiver para estourar a memória, suspendê-la e deixar com o que garbage collector limpe o que ainda ficou. O melhor para tudo isso é um profiler, tem vários por aí com integração com as IDEs.

Até!

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team