Heap Space sempre aumentando

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

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

Já aplicou algum profiler?

[]'s

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.

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

Está rodando em Application Server ou standalone?

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.

[quote=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.[/quote]
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.

[quote=juliocbq][quote=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.[/quote]
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. [/quote]

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

[]'s

[quote=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. [/quote]

Correto, porem os maps são estaticos.

[quote=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[/quote]

Blz, vou testar aqui.

[quote=Hebertbc][quote=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. [/quote]

Correto, porem os maps são estaticos.

[quote=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[/quote]

Blz, vou testar aqui.[/quote]

ok, mas o que os impedem de expandirem?

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.

[quote=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.[/quote]

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.

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)
 ...

[quote=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.

[code]
objDinamico{
atbDinamico

atbEstatico

}

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

[/code][/quote]

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.