Heap Space sempre aumentando

13 respostas
Hebertbc

Boa tarde, o titulo ja diz tudo, o sistema possui apenas 3 threads ativas (ServerSocket) que ficam aguardando a conexão de um cliente. O grafico abaixo mostra o sistema rodando por uma hora sem nenhuma atividade. Alguem saberia me explicar o que pode estar acontecendo?

Grato pela atenção

13 Respostas

Alexandre_Saudate

Tem certeza de que esses Sockets não recebem absolutamente nenhum dado?

Já aplicou algum profiler?

[]'s

Hebertbc

certeza, os sockets estao configurados pra trabalhar em blocking, tenho uma flag indicando qdo recebe alguma informação. E como assim aplicou algum profiler? Se quer dizer usar o profiler do netbeans, por exemplo, apresenta o mesmo grafico.

J

Você tem que fazer um profiler e ver qual tipo de dado está ocupando memória. Normalmente e alguma lista que esqueceu de liberar.

Alexandre_Saudate

Está rodando em Application Server ou standalone?

Hebertbc

Ocupar um espaço da memoria blz, pq tenho varios Map, o que me chama a atenção é o gasto alto de memoria em standby, pq chega uma hora ke acaba alocando toda a memoria e ocasiona uma exceção.
E estou rodando em uma jvm standalone.

J

Hebertbc:
Ocupar um espaço da memoria blz, pq tenho varios Map, o que me chama a atenção é o gasto alto de memoria em standby, pq chega uma hora ke acaba alocando toda a memoria e ocasiona uma exceção.
E estou rodando em uma jvm standalone.

Você não espera que o gc libere automáticamente uma coleção de maps que estão referenciados em memória né!? Verifica se eles ainda estão alocados. Talvez você esteja adicionando nos maps e não está gerenciando o tamanho dele. Isso aí é um memory leak.

Alexandre_Saudate

juliocbq:
Hebertbc:
Ocupar um espaço da memoria blz, pq tenho varios Map, o que me chama a atenção é o gasto alto de memoria em standby, pq chega uma hora ke acaba alocando toda a memoria e ocasiona uma exceção.
E estou rodando em uma jvm standalone.

Você não espera que o gc libere automáticamente uma coleção de maps que estão referenciados em memória né!? Verifica se eles ainda estão alocados. Talvez você esteja adicionando nos maps e não está gerenciando o tamanho dele. Isso aí é um memory leak.

Pra fazer o que o juliocbq está falando, você pode usar o JProfiler. Vai ser mais eficiente que o profiler do Netbeans :wink:

[]'s

Hebertbc

juliocbq:

Você não espera que o gc libere automáticamente uma coleção de maps que estão referenciados em memória né!? Verifica se eles ainda estão alocados. Talvez você esteja adicionando nos maps e não está gerenciando o tamanho dele. Isso aí é um memory leak.

Correto, porem os maps são estaticos.

asaudate:
Pra fazer o que o juliocbq está falando, você pode usar o JProfiler. Vai ser mais eficiente que o profiler do Netbeans :wink:

[]'s

Blz, vou testar aqui.

J

Hebertbc:
juliocbq:

Você não espera que o gc libere automáticamente uma coleção de maps que estão referenciados em memória né!? Verifica se eles ainda estão alocados. Talvez você esteja adicionando nos maps e não está gerenciando o tamanho dele. Isso aí é um memory leak.

Correto, porem os maps são estaticos.

asaudate:
Pra fazer o que o juliocbq está falando, você pode usar o JProfiler. Vai ser mais eficiente que o profiler do Netbeans :wink:

[]'s

Blz, vou testar aqui.

ok, mas o que os impedem de expandirem?

Hebertbc

Os Map não espandem pois são dados estaticos, para dados dinamicos possuo outros Map (exemplo: lista de clientes conectados)

O sistema funciona assim:

-Inicio do sistema, carrego os dados em Map estaticos
-Sistema em standby aguardando a conexão de algum cliente

caso algum cliente conecte:
-cliente conecta
-Inicia uma thread para o cliente
-cliente executa suas ações, comunicação via sockets
-cliente desconecta, caso o cliente criou alguma thread, todas sao finalizadas

Porem apenas iniciando o sistema, sem nenhuma conexão (certeza!), o mesmo apresenta esse grafico, e como pode ver deixei ele parado por mais de 1h.

J

Hebertbc:
Os Map não espandem pois são dados estaticos, para dados dinamicos possuo outros Map (exemplo: lista de clientes conectados)

O sistema funciona assim:

-Inicio do sistema, carrego os dados em Map estaticos
-Sistema em standby aguardando a conexão de algum cliente

caso algum cliente conecte:
-cliente conecta
-Inicia uma thread para o cliente
-cliente executa suas ações, comunicação via sockets
-cliente desconecta, caso o cliente criou alguma thread, todas sao finalizadas

Porem apenas iniciando o sistema, sem nenhuma conexão (certeza!), o mesmo apresenta esse grafico, e como pode ver deixei ele parado por mais de 1h.

A keyword static só garante que você terá um endereço de memoria, não que ele não possa crescer se você adicionar objetos a ele. Verifica se você não esqueceu de gerênciar esses maps em algum momento.

Hebertbc

qual sua definição para gerenciar? desculpe-me a pergunta ^^

obs: quando digo ‘dados estaticos’, é com garantia que não serao modificados, apenas referenciados por outros objetos.

objDinamico{
 atbDinamico
 ...

 atbEstatico
 ...
}

objEstatico{
 atbEstatico (regra: nunca relaciona um objeto dinamico)
 ...
J
Hebertbc:
qual sua definição para gerenciar? desculpe-me a pergunta ^^

obs: quando digo 'dados estaticos', é com garantia que não serao modificados, apenas referenciados por outros objetos.

objDinamico{
 atbDinamico
 ...

 atbEstatico
 ...
}

objEstatico{
 atbEstatico (regra: nunca relaciona um objeto dinamico)
 ...

Quando você disse estatico imaginei que fossem static.
Quando você usar a jvisualvm, no profiler existe uma opção para ver o que esta alocado na heap. Com base nó tipo do dado voce Vai ter ideia do objeto que mais aloca em um curto espaço de tempo. A regra e não deixar nenhum conteiner referenciado por outro objeto. O gc só coleta o que não possui contador de referencia.

Criado 2 de setembro de 2011
Ultima resposta 6 de set. de 2011
Respostas 13
Participantes 3