Altri hanno fornito suggerimenti su come monitorare l'utilizzo della memoria ...
Suppose I have two tomcat app server in production, load balance set up behind them. If I can see the jvm memory statistics I can tell load balance to stop sending the request to the server which will encounter OOM issue. Do this make sense?
Ordina. Ma non è necessariamente il modo migliore per risolvere il tuo problema.
Consente di tornare alla radice del problema ... le OOME. Nel contesto di Tomcat, è probabile che OOME sia causato da uno dei seguenti:
- perdite di memoria nell'applicazione, (o possibilmente Tomcat stesso),
- tenta di elaborare troppe richieste in parallelo su ciascun Tomcat o
- richieste individuali che richiedono troppa memoria durante l'elaborazione.
Per risolvere il tuo problema, devi prima scoprire quale di questi sta accadendo ... perché la soluzione è diversa per ognuno di essi.
1) Per vedere se si tratta di una perdita di memoria, è necessario utilizzare uno strumento di analisi della memoria per esaminare i modelli di utilizzo della memoria a lungo termine. Questo probabilmente mostrerà un motivo a dente di sega ... che è normale. Quello che devi cercare è il livello del fondo dei "denti" che tende verso l'alto nel tempo. Ciò indica che qualcosa sta creando spazzatura che non può essere raccolta; cioè una perdita di memoria.
Se hai una perdita di memoria, la soluzione migliore è capire quale parte del codice è responsabile e correggerla. Qualsiasi altra cosa ... compreso il bilanciamento del carico ... è una soluzione bandaid e potrebbe portare a problemi peggiori in pista.
2) Dopo aver eliminato le perdite di memoria, è necessario capire se il problema è che si stanno elaborando troppe richieste contemporaneamente. Non sono sicuro del modo migliore per farlo, ma se questo è il problema (o sospetti che lo sia), allora ci sono alcune possibili soluzioni:
-
Modifica la configurazione del server Tomcat per ridurre il numero di thread di lavoro.
-
Se le tue richieste sono vincolate all'I / O, allora un'altra possibilità sarebbe quella di esaminare il supporto per la gestione asincrona delle richieste disponibile nelle versioni recenti delle specifiche Servlet - vedi link . Ma quello sarà più lavoro.
3) Se il problema si verifica quando alcune richieste utilizzano troppa memoria, è necessario capire come rilevare le richieste in anticipo e "gestirle". Sia il rilevamento e la gestione di queste richieste potrebbe essere difficile ... ed è difficile da consigliare senza dettagli della vostra applicazione. Ma un paio di soluzioni pragmatiche sono:
-
Inoltra le richieste anomale a un altro server con un grande heap ... dove le OOME non interferiscono con le richieste "normali".
-
Aumenta la dimensione dell'heap. Se hai abbastanza memoria fisica, l'esecuzione con un heap più grande potrebbe effettivamente rendere i tuoi server Tomcat più efficienti ... oltre a evitare OOMEs.
In sintesi, provando piuttosto a caricare il bilanciamento per evitare OOME, ti suggerisco di capire perché stai ricevendo OOMEs ... e provare a gestire direttamente la causa di OOME.