Domanda

Spesso, ho trovato OutOfMemoryException su IBM Websphere Application Server. Penso che questa eccezione si verifichi perché la mia applicazione recupera enormi dati dal database. Quindi, limito tutte le query a non recuperare più di 1000 record e impostare JVM of WAS follow

+ 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 ho trovato heapdump , javacore e snap nella cartella dei profili, penso che possano parlarmi della causa del problema, ma non so come leggere / usare i file heapdump, javacore e snap.

Per favore, dimmi come prevenire / evitare / correggere OutOfMemoryException. Grazie

È stato utile?

Soluzione

La risposta dipende dal messaggio associato a OutOfMemoryException. Puoi anche provare -XX: MaxPermSize = ... e impostarlo su qualcosa di più grande come 256m.

Inoltre, se si dispone di una funzione ricorsiva da qualche parte, ciò potrebbe causare un overflow dello stack.

Se puoi, pubblica il messaggio associato all'eccezione. Stacktrace potrebbe anche aiutare.

Altri suggerimenti

Se si desidera esaminare i file di dump dell'heap, IBM offre strumenti per analizzarli qui .

" Grazie per la memoria " è un buon articolo sull'uso della memoria da parte delle JVM, che potrebbe aiutare ad analizzare questo problema ...

Grazie a bwalliser per questo link

Prova a riprodurre il problema localmente in modo da poter utilizzare uno strumento come JProfiler per eseguirne il debug. Anche se non puoi forzare una OOM localmente, è probabile che vedrai aumentare la memoria in JProfiler. Quindi fai delle istantanee e cerchi le classi che non vengono raccolte. Non è una scienza esatta, ma è molto più facile che guardare attraverso un heapdump IBM. Tuttavia, se è necessario, il vecchio modo di esaminare una discarica dell'heap era con HeapRoots. Potrebbe dipendere dalla versione in cui ti trovi. So che alcune versioni di IBM JDK hanno problemi con la compattazione, quindi anche se hai molta memoria, puoi ottenere una OOM perché non c'è un frammento abbastanza grande disponibile.

Suppongo che tu stia utilizzando hibernate / JPA come provider di persistenza? Stai usando una cache di secondo livello? In tal caso, hai preso in considerazione la possibilità di eliminare grandi set di risultati dalla cache?

Alla domanda è difficile rispondere se non sappiamo che tipo di OutOfMemoryError è; permgen e heapspace sono due bestie molto diverse.

Stavo inseguendo un permesso da molti mesi su JBoss, sebbene quel particolare tipo di problema fosse generale per qualsiasi server applicativo che ricaricasse le applicazioni web al volo. La saga è documentata qui .

Quelle discariche che hai ... potrebbero essere che puoi analizzarle in Eclipse MAT .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top