Altri hanno fornito suggerimenti su come monitorare l'utilizzo della memoria ...
Supponiamo che io abbia due server di applicazioni Tomcat in produzione, con il bilanciamento del carico impostato dietro di loro. Se riesco a visualizzare le statistiche della memoria jvm, posso dire al bilanciamento del carico di interrompere l'invio della richiesta al server che riscontrerà un problema OOM. Questo ha senso?
Una specie di. Ma non è necessariamente il modo migliore per risolvere il tuo problema.
Consente di tornare indietro alla radice del problema ... gli OOME. Nel contesto di Tomcat, è probabile che gli OOME siano causati da uno dei seguenti:
- perdite di memoria nell'applicazione (o eventualmente Tomcat stesso),
- tentando di elaborare troppe richieste in parallelo su ciascun Tomcat, oppure
- 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 ciascuno 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à uno schema a dente di sega ... che è normale. Quello che devi cercare è il livello del fondo dei "denti" che tende nel tempo verso l'alto. Ciò indica che qualcosa sta creando immondizia che non può essere raccolta; cioè una perdita di memoria.
Se hai una perdita di memoria, la soluzione migliore è capire quale parte del tuo codice è responsabile e risolverlo. Qualsiasi altra cosa ... compreso il bilanciamento del carico ... è una soluzione bandaid e potrebbe portare a problemi peggiori lungo il percorso.
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:
Regola la configurazione del server Tomcat per ridurre il numero di thread di lavoro.
Se le tue richieste sono legate all'I / O, un'altra possibilità sarebbe quella di consultare il supporto per la gestione delle richieste asincrone disponibile nelle versioni recenti delle specifiche Servlet - vedi http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Ma sarà più lavoro.
3) Se il problema risulta essere che determinate richieste utilizzano troppa memoria, è necessario capire come rilevare prima quelle richieste e "gestirle". Individuare e gestire queste richieste potrebbe essere difficile ... ed è difficile consigliarlo senza i dettagli dell'applicazione. Ma un paio di soluzioni pragmatiche sono:
Inoltra le richieste anomale a un altro server con un grande heap ... dove gli OOME non interferiranno con le richieste "normali".
Aumenta le dimensioni 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 OOME.
In sintesi, piuttosto cercando di bilanciare il carico per evitare OOME, ti suggerisco di capire perché stai ricevendo OOME ... e provare a gestire direttamente la causa degli OOME.