tomcat изолировать веб-приложения - PullRequest
4 голосов
/ 19 марта 2010

несколько веб-приложений, работающих на одном и том же Tomcat, используя тот же JVM. Когда-нибудь одно веб-приложение с утечкой памяти вызовет сбой всего jvm и повлияет на другие веб-приложения. Любая рекомендация, как изолировать, что без необходимости использовать несколько JVM и Tomcat

Ответы [ 7 ]

6 голосов
/ 19 марта 2010

В одной и той же JVM все разделяют одну и ту же память. Нет системы для выделения отдельных пулов или квот.

Если одно из ваших приложений ведет себя очень плохо в этом отношении, единственное, что вы можете сделать, это запустить его изолированным в отдельной JVM (отдельный Tomcat).

1 голос
/ 07 сентября 2010

JSR 121 был разработан для решения этой проблемы, но еще не был реализован.

1 голос
/ 01 апреля 2010

Вы не можете изолировать приложения в одной и той же JVM (хотя вы можете делать такие вещи, как инструментальное приложение ClassLoader для диагностики)

Если вас беспокоит администрирование / настройка (а не общее потребление памяти), вы можете запустить несколько экземпляров Tomcat с одной и той же установки, используя catalina.home и catalina.base

1 голос
/ 19 марта 2010

Насколько мне известно, короткий ответ: нет, это не может быть сделано. Tomcat использует единое пространство памяти для всех запущенных приложений.

Мой ответ на этот вопрос заключается в том, что вы должны исправить утечку памяти, а не пытаться изолировать неправильно работающее приложение. Вылечить лучше, чем карантин. Поскольку я не знаю деталей вашей проблемы, возможно, по какой-то причине это не практично.

1 голос
/ 19 марта 2010

Приложения работают как отдельные процессы?Или тот же самый?

Прежде всего вы должны взглянуть на профилирование, чтобы найти утечку памяти https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools.

Однако, как быстрое решение изнутри вы можете использовать Runtime.getRuntime (). TotalMemory(), чтобы узнать, сколько памяти используется, и если она превышает определенный предел, и вы знаете, какое приложение вызывает проблему, вы можете перезапустить это приложение.

Вы также можете попробовать запустить System.gc() это ужасный способ сделать это, и его не следует использовать, так как JVM может его игнорировать.

0 голосов
/ 24 октября 2013

Чтобы обновить это, теперь возможно запускать несколько приложений на одной JVM. Приложения запускаются в изолированных виртуальных контейнерах Java, которые защищают ваши приложения от «шумных соседей», а также позволяют вам совместно использовать ресурсы между приложениями. Это дает вам изоляцию, эластичность и увеличенную плотность приложений для Apache Tomcat. Загрузите его с www.elasticat.com Примечание: я работаю на Waratek, который разработал эту новую JVM

0 голосов
/ 24 сентября 2013

В Java нет стандартной системы, позволяющей по-настоящему изолировать память, используемую веб-приложениями.

Тем не менее, вы можете написать некоторую логику переплетения байт-кода, чтобы отслеживать, сколько памяти выделено конкретному приложению. Если он превышает определенный порог, вы можете выдать исключение и остановить приложение от выделения памяти. Что вы хотите сделать, если вы могли бы отслеживать всю память, потребляемую веб-приложением? Что вы пытаетесь реализовать?

Обратите внимание, что это действительно будет эффективно работать только для того, чтобы выяснить, сколько памяти выделено веб-приложению, а не сколько он потребляет в настоящее время в системе. Для того, чтобы получить эту метрику, вам нужно было бы использовать байтовый код weave finalize () для всех объектов. Поскольку finalize () запускается JVM наилучшим образом, это может не дать вам наиболее точного значения, если система находится под нагрузкой. JVM удалит приоритеты из этих завершающих потоков, и ваше значение никогда не будет обновлено, даже если объекты были очищены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...