Pergunta

Muitas vezes, eu encontrei OutOfMemoryException no IBM WebSphere Application Server. Eu acho que essa exceção ocorrer porque a minha aplicação recuperar dados enormes de banco de dados. Então, eu limitar toda consulta fazer de dados não retreive mais de 1000 registros e definir JVM da era seguir

+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent  
                    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000 
                          -Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc  
                          -Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)

E eu achei heapdump , javacore e Encaixar arquivos em perfis de pasta eu acho que eles podem me dizer sobre causa de problema, mas eu don' t sabe ler / uso heapdump, javacore e encaixe arquivos.

Por favor me diga como prevenir / evitar / fix OutOfMemoryException. Graças

Foi útil?

Solução

A resposta a esta depende da mensagem associada ao OutOfMemoryException. Você também pode tentar XX:. MaxPermSize = ... e configurá-lo para algo maior, como 256m

Além disso, se você tem uma função em algum lugar recursiva, que pode estar causando um estouro de pilha.

Se você puder, por favor postar a mensagem associada à exceção. Stacktrace pode também ajuda.

Outras dicas

Se você quiser olhar para os arquivos de despejo de pilha, a IBM oferece ferramentas para analisá-los aqui .

"Obrigado pela memória" é um bom artigo sobre as JVMs utilização de memória, o que pode ajudar a analisar este problema ...

Graças à bwalliser para este link

Tente reproduzir o problema localmente para que você pode usar uma ferramenta como JProfiler depurá-lo. Mesmo que você não pode forçar um OOM localmente, as chances são que você vai ver o aumento de memória em JProfiler. Então você tirar fotos e olhar para as classes que não estão sendo lixo coletado. Não é uma ciência exata, mas é muito mais fácil do que olhar através de um heapdump IBM. No entanto, se você tem que, a velha maneira de examinar um despejo de pilha estava com HeapRoots. Pode depender da versão que você está. Eu sei que algumas versões do IBM JDK têm problemas com compactação por isso mesmo que você tem muita memória, você pode obter um OOM porque não há um grande fragmento suficiente disponível.

Eu assumo o seu usando hibernate / JPA como um provedor de persistência? Você está usando um cache de segundo nível? Se assim você já pensou em expulsar grandes conjuntos de resultados a partir do cache?

A pergunta é difícil de responder, se não sabemos o que tipo de OutOfMemoryError é; permgen e heapspace são duas bestas muito diferentes.

Eu estava perseguindo um perm-gen por muitos meses no JBoss, embora a esse tipo particular de problema era geral a qualquer servidor de aplicativos que aplicações web Reloaded na mosca. A saga está documentado aqui .

Aqueles pilha-despeja você tem ... pode ser que você pode analisá-los em Eclipse MAT .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top