Інші надали пропозиції щодо контролю за використанням пам'яті ...
Припустимо, у мене є два сервери додатків tomcat у виробництві, баланс навантаження встановлений за ними. Якщо я можу побачити статистику пам'яті jvm, я можу сказати баланс завантаження, щоб припинити надсилання запиту на сервер, який зіткнеться з проблемою OOM. Це має сенс?
Типу. Але це не обов'язково найкращий спосіб вирішити вашу проблему.
Дозволяє повернутись до кореня проблеми ... OOMEs. У контексті Tomcat, OOMEs, можливо, буде викликано одним із наступних:
- пам'ять протікає у вашій програмі (або, можливо, сам Tomcat),
- намагаючись обробити занадто багато запитів паралельно на кожному Tomcat, або
- індивідуальні запити, яким потрібно занадто багато пам'яті під час обробки.
Щоб вирішити свою проблему, спочатку потрібно з’ясувати, що з них відбувається… адже рішення для кожного з них різне.
1) Щоб побачити, чи це витік пам’яті, вам потрібно скористатися інструментом аналізу пам’яті для вивчення довготривалих моделей використання пам’яті. Це, ймовірно, покаже малюнок пиляного зуба ... це нормально. На що потрібно звернути увагу, - це рівень дна «зубів», що мають тенденцію вгору. Це вказує на те, що щось створює сміття, яке неможливо зібрати; тобто витік пам'яті.
Якщо у вас є витік пам’яті, то найкращим рішенням буде з’ясувати, яка частина вашого коду відповідає, і виправити це. Все інше ... в тому числі балансування навантаження ... є рішучим рішенням і може призвести до ще гірших проблем.
2) Усунувши витоки пам'яті, вам потрібно з’ясувати, чи проблема полягає в тому, що ви обробляєте занадто багато запитів одночасно. Я не впевнений у найкращому способі це зробити, але якщо це проблема (або ви підозрюєте, що це є), то є кілька можливих рішень:
Відрегулюйте конфігурацію сервера Tomcat, щоб зменшити кількість робочих потоків.
Якщо ваші запити пов'язані з входом / виводом, то іншою можливістю буде переглянути асинхронну підтримку обробки запитів, доступну в останніх версіях специфікації Servlet - див. Http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Але це буде більше роботи.
3) Якщо проблема виявляється в тому, що певні запити використовують занадто багато пам’яті, то вам потрібно розібратися, як виявити ці запити перед рукою та «розібратися з ними». Виявлення та вирішення цих запитів може бути важким ... і важко порадити без деталей вашої заяви. Але пара прагматичних рішень:
Пересилайте аномальні запити на інший сервер з великою купою ... де OOMEs не заважатиме "нормальним" запитам.
Збільшити розмір купи. Якщо у вас достатньо фізичної пам’яті, біг із більшою купою може насправді зробити ваші сервери Tomcat більш ефективними… а також уникати OOMEs.
Підводячи підсумок, радше намагаючись завантажити баланс, щоб уникнути OOMEs, я пропоную вам розібратися, чому ви отримуєте OOMEs ... і спробувати вирішити причину OOMEs безпосередньо.