Aplicação consome toda a memória, travando as demais.

480 views
Skip to first unread message

Anderson Matos

unread,
Jun 3, 2016, 1:12:14 PM6/3/16
to javasf: JavaServer Faces Group
Salve pessoal!
Ha algum tempo venho sofrendo com o seguinte problema:
Tenho várias aplicações rodando no Tomcat 7 e dentre elas tem uma que gradativamente vai consumindo toda Memória e Uso de CPU.
Quando isso acontece, todas as outras aplicações ficam inacessíveis, ou seja, trava tudo. Daí reinicio o Tomcat e tudo volta ao normal até que a bendita aplicação consuma tudo novamente. E assim to seguindo a vida. 
Outro dia no momento em que estava tudo travado, dei uma olhada nos processos e dei um jtask no PID que estava com o maior consumo e vi que era o GB (Garbage Collector) que está acabando com tudo. Daí criei o arquivo tomcat/bin/setenv.sh com o seguinte conteudo: export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=512m" (não sei se falta algum parametro neste arquivo) mas mesmo assim não obtive sucesso.
Venho aqui apelar pela ajuda de vocês. Agradeço aos que se interessarem pelo caso.
Obrigado!

Ambiente:
- Ubunto Server12.04 x64
- 8 GB RAM
- Java 7
- Tomcat 7

Aplicação:
JSF 2
Primefaces
JPA
iReport
SQL Server

Arthur Gregório

unread,
Jun 3, 2016, 1:18:53 PM6/3/16
to jav...@googlegroups.com
Isso é um problema bem clássico, pode ser sua app como também uma lib... Tive um caso idêntico ao seu mas era o Infinispan executando algumas operações de cache que estouravam a minha heap.

Bastaria aumentá-la como vc fez, mas isso apenas iria aumentar o tempo que o problema levaria para ocorrer.

A melhor forma de saber o que esta rolando, é setar um valor aceitável para a sua perm space e a heap e em seguida rodar um profiler da aplicação para descobrir se não pode ser alguma falha de programação sua ou alguma lib zoada.

O Netbeans tem um profiler bem legal para coisas simples, mas vc também pode usar o Java Mission Control.

at.,

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/9f728032-85bb-4701-a218-44103a3ed08a%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Rafael Ponte

unread,
Jun 3, 2016, 1:34:37 PM6/3/16
to jav...@googlegroups.com
Olá,

Aumentar a memoria do Tomcat é uma solução paliativa, daqui algumas semanas você terá que aumentar novamente até um ponto que sua máquina não possui mais memoria fisica.

Como o Arthur comentou, aumente a memoria nesse momento e rode um profiler para descobrir qual a aplicação está consumindo memoria e o local exato (classe ou componente ou lib). Não é uma tarefa simples, dependendo do vazamento de memoria isso pode ser descoberto em 1h como em 2 semanas.

Se você tem idéia de qual aplicação está dando problema então fica mais fácil, pois você pode isolá-la num Tomcat a parte (na sua máquina mesmo) e extressar ela. Talvez você ache o vazamento, talvez não. Tudo depende do tamanho do "buraco".

Um abraço,



Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Anderson Matos

unread,
Jun 3, 2016, 1:40:39 PM6/3/16
to javasf: JavaServer Faces Group
Olá Rafael!
Então, sei qual é a aplicação sim, e o problema está relacionado com o Garbage Collector. O problema é que não tenho a minima ideia de como resolver.

Rafael Ponte

unread,
Jun 3, 2016, 1:55:30 PM6/3/16
to javasf: JavaServer Faces Group
Oi,

O problema nao é o GC, ele faz bem o trabalho dele, mas sim a aplicação que continua referenciando objetos que deveriam ser descartados :-)

Acredite em mim, 90% dos casos de vazamento de memoria a culpa é da aplicação!



Para mais opções, acesse https://groups.google.com/d/optout.

Fernando Schmitt Daufemback

unread,
Jun 3, 2016, 1:58:57 PM6/3/16
to jav...@googlegroups.com
Olá, 

Passei por isso, e as vezes ainda acontece, no meu caso era algumas Threads que eu não finalizava de forma correta.


Para mais opções, acesse https://groups.google.com/d/optout.



--

Fernando Schmitt Daufemback

Phone: + 55 (48) 3648-2061
Mobile: + 55 (48) 9145-4944 / 9608-6628

Anderson Matos

unread,
Jun 3, 2016, 2:06:34 PM6/3/16
to javasf: JavaServer Faces Group
Sim sim, acredito. Entendi.

Anderson Matos

unread,
Jun 3, 2016, 2:07:19 PM6/3/16
to javasf: JavaServer Faces Group
Pode citar exemplos (bem prático), Fernando?
Obrigado.

Levy Moreira

unread,
Jun 3, 2016, 2:14:44 PM6/3/16
to jav...@googlegroups.com
Baixa o trial desse cara aqui:

Sobe o app com ele ativado, se ainda assim não achar,
configura tua vm pra gravar um dump ao estourar a memoria (HeapDumpOnOutOfMemoryError) e abre o dump com esse rapaz: http://www.eclipse.org/mat/ 
que ele mostra quem ta comendo a memória. (Obg. Rafael Ucha pela dica)


--
Levy Moreira

Arthur Gregório

unread,
Jun 3, 2016, 2:14:53 PM6/3/16
to jav...@googlegroups.com
Profiler, ele vai te dizer certinho onde é.

Fernando Schmitt Daufemback

unread,
Jun 3, 2016, 2:17:55 PM6/3/16
to jav...@googlegroups.com

Uma aplicação que acessa alguns webservices cada conexão é uma thread,  quando a conexão cai ou cai Internet preciso refazer a conexão,  eu iniciava uma nova thread para isso,  a anterior continuava processando e ocupando memória. Ao longo do tempo dava permGen....

Fernando Schmitt Daufemback

unread,
Jun 3, 2016, 2:20:04 PM6/3/16
to jav...@googlegroups.com

Boa dica Arthur, também não usava.

Arthur Gregório

unread,
Jun 3, 2016, 2:21:29 PM6/3/16
to jav...@googlegroups.com
O Java Mission Control que vem no JDK já resolve, com ele da pra acompanhar tudo. 

No Netbeans o profiler integrado também já da uma ajuda, e ele é mais simples de operar.

at.,

Davi Mustafa

unread,
Jun 3, 2016, 2:24:56 PM6/3/16
to javasf: JavaServer Faces Group
Não aparece nenhum erro na aplicação? As vezes ate configurações de banco de dados causam isso.


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Everton Fujimoto

unread,
Jun 3, 2016, 9:34:23 PM6/3/16
to jav...@googlegroups.com
Como disseram, pode ser muitos problemas diferentes causando isso e o GC funciona muito bem. 

Alguns problemas bem comuns são:

1. Collections em escopo "estático". 
2. Processo/thread em algum escopo de aplicação (Exemplo, EJB Singleton) que utiliza JPA sem dar um "clear" no entity manager (por exemplo, um while(true) que fica consultando na base)
3. Threads "soltas" na memória comendo processamento e memória. 
4. JMS lançando exception (famoso "hot potato"), mas nesse caso é mais difícil dar erro de heap. 

A sugestão mais prática que conheço é quando estiver com esse erro (ou depois de um certo tempo com a aplicação na memória) em produção tirar um dump com jhat, baixar para a sua máquina e subir ele numa porta com o jmap. (ou o contrário, não lembro) Embora as sugestões com os profilers também sejam boas, geralmente não é possível usá-los em produção. 

Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

Joaquim Hangalo

unread,
Jun 4, 2016, 5:54:53 AM6/4/16
to javasf
Na verdade a minha alguma experiencia diz que o problema tem a ver com as consultas com JPA.
Se eventualmente voce faz as pesquisas directamente sobre as entidades... voce acaba carregando objectos inuteis que consomem toda a memoria...
Se for o caso o ideal e' criar classes auxiliares para fazer as consultas.... usando  SELECT NEW

veja dicas neste link

http://blog.michaelnascimento.com.br/2012/08/21/typedquery-e-select-new-dois-excelentes-recursos-pouco-utilizados/


--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/9f728032-85bb-4701-a218-44103a3ed08a%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--








"Só imprima esse e-mail se for realmente necessário, evite ao máximo o desperdício de papel. O papel reciclado utiliza aproximadamente 60% menos energia e água para ser feito do que o papel novo. Use papel reciclado."

Anderson Matos

unread,
Jun 6, 2016, 6:45:44 AM6/6/16
to javasf: JavaServer Faces Group
Pessoal, bom dia!
Gostaria de agradecer a todos pelas as sugestões.
Vou experimentar as soluções propostas e volto aqui para futuras dúvidas.
Obrigado.

Anderson Matos

unread,
Jun 6, 2016, 8:42:04 AM6/6/16
to javasf: JavaServer Faces Group

O Garbage Collector é um recurso fornecido pela plataforma Java que elimina a necessidade do desenvolvedor liberar explicitamente objetos da memória. Porém, o custo disso é o overhead de desempenho quando a coleta de lixo é executada. Ou seja, digamos que eu possua uma página de busca cujo seu controller é de @SessionScoped. Com isso quando feita a busca, é carregado uma lista e esta armazenada na sessão. Mesmo que eu saia da página de busca, ainda assim ficará na memória e com o decorrer do tempo, vir a causar o problema em questão. Correto? Pode ser isso uma das causas?


Em sexta-feira, 3 de junho de 2016 14:12:14 UTC-3, Anderson Matos escreveu:

Davi Mustafa

unread,
Jun 6, 2016, 8:48:10 AM6/6/16
to javasf: JavaServer Faces Group
a pagina carrega tanta informação assim? você tem muitos controllers SessionScoped?

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Anderson Matos

unread,
Jun 6, 2016, 9:01:00 AM6/6/16
to javasf: JavaServer Faces Group
Tenho

Davi Mustafa

unread,
Jun 6, 2016, 9:03:16 AM6/6/16
to javasf: JavaServer Faces Group
Há a necessidade disso ou tu acha que poderia tentar usar o view scoped e ver se melhora?

Usando escopo de que? Spring? JSF? CDI?


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Anderson Matos

unread,
Jun 6, 2016, 9:08:41 AM6/6/16
to javasf: JavaServer Faces Group
JSF. Não, não há a necessidade. Já estou analisando a mudança. Mas ainda assim, gostaria de saber:


O Garbage Collector é um recurso fornecido pela plataforma Java que elimina a necessidade do desenvolvedor liberar explicitamente objetos da memória. Porém, o custo disso é o overhead de desempenho quando a coleta de lixo é executada. Ou seja, digamos que eu possua uma página de busca cujo seu controller é de @SessionScoped. Com isso quando feita a busca, é carregado uma lista e esta armazenada na sessão. Mesmo que eu saia da página de busca, ainda assim ficará na memória e com o decorrer do tempo, vir a causar o problema em questão. Correto? Pode ser isso uma das causas?


Arthur Gregório

unread,
Jun 6, 2016, 9:31:56 AM6/6/16
to jav...@googlegroups.com
Recomendo a leitura: http://javapapers.com/java/how-java-garbage-collection-works/

Outra coisa é usar os escopos corretos, no JSF usar algo por usar vai lhe custar um caro dependendo da situação.

Anderson Matos

unread,
Jun 6, 2016, 9:42:20 AM6/6/16
to javasf: JavaServer Faces Group
Blz. Vlw Arthur!

Ricardo Johannsen

unread,
Jun 6, 2016, 1:10:23 PM6/6/16
to javasf: JavaServer Faces Group
você utiliza muitos beans viewscope, se sim dá uma observada neles, muita gente reclama de problemas com memoria relacionado ao escopo view, o escopo view não funciona tão perfeito quando se imagina, se você utiliza então navegação com get em suas páginas as coisas pioram, você troca de página mas o maldito do bean fica lá em uma estrutura de dados chamados LRU .Pior por padrão pode armazenar até 25 beans viewscope, oque pode ser até mais nocivo que utilizar o bean no escopo de sessão, se estiver utilizando view scope investiga se eles estão sendo destuidos. Se o problema for esse eu aconselho a usar ViewAcessScoped do DeltaSpike

Anderson Matos

unread,
Jun 6, 2016, 1:15:49 PM6/6/16
to javasf: JavaServer Faces Group
Não sabia dessa. Obrigado pelo alerta.

Ricardo Johannsen

unread,
Jun 6, 2016, 1:20:36 PM6/6/16
to javasf: JavaServer Faces Group

Rafael Ponte

unread,
Jun 6, 2016, 1:31:15 PM6/6/16
to javasf: JavaServer Faces Group
Opa,

Boa dica Ricardo. A verdade é que o momento em que os beans @ViewScoped são destruídos nem é o problema de fato, caso seja, pode-se diminuir o número de views "cacheadas" por usuário. Na minha opinião o principal problema tem a ver com o que se coloca num managed bean, por exemplo, uma lista com todos os registros do banco de dados, ou um relatório PDF de 5mb etc.

As configurações padrões do Mojarra funcionam bem para maioria das aplicações, principalmente se você mantém sua aplicação sempre com o JAR mais recente do JSF. E claro, estou falando JSF 2.x, pois JSF 1.2 era horrível com relação a consumo de memória.

Um abraço,



Para mais opções, acesse https://groups.google.com/d/optout.
--

Anderson Matos

unread,
Jun 6, 2016, 1:46:55 PM6/6/16
to javasf: JavaServer Faces Group
Boa, Raphael!
Reply all
Reply to author
Forward
0 new messages