Java AppDomain как абстракция? - PullRequest
11 голосов
/ 29 июня 2009

Мне любопытно, есть ли какие-либо абстракции Java, похожие на домен приложений .Net.

В частности, мне любопытно, потому что я обнаружил, что с нашим сервером Coldfusion / J2EE нам нужно перезапускать его каждые несколько дней из-за медленной утечки памяти, которую мы пока не смогли легко отследить. Это может разрушить наши длительные процессы, и нам бы очень хотелось, чтобы люди просто медленно подталкивали людей к новым JVM по мере того, как они стареют после определенного периода времени / порога памяти.

Исходя из моего ограниченного опыта .Net, я почти уверен, что это одна из ситуаций, в которой IIS и AppDomains могут довольно легко управлять, перерабатывая AppDomains, которые испытывают нехватку памяти. Пожалуйста, дайте мне знать, если я не буду помогать доменам приложений, помогающим в этом сценарии.

Есть предложения?

Ответы [ 3 ]

10 голосов
/ 12 сентября 2009

Я думаю, что принятый здесь ответ немного вводит в заблуждение. Просто сказать «нет, ты не можешь» - это еще не все. Вопрос состоит в том, чтобы выгрузить классы Java в процесс сервера, чтобы удалить утечки кода из процесса JVM без перезапуска процесса. OP не запрашивает функцию изоляции памяти, подобную процессу, которую предоставляет AppDomain, а возможность выгружать классы в работающей JVM. Я говорю, что процесс похож на процесс, поскольку AppDomain не является процессом, но обладает некоторыми аспектами изоляции, которые предоставляет первоклассный процесс операционной системе. Упомянутый изолят JSR относится к этой «подобной процессу» изоляции. Возможна выгрузка java ClassLoaders и, следовательно, классов без циклического запуска процесса ОС, на котором размещается JVM. Здесь упоминается пара методов: SO 148681 . Это не тривиально и не элегантно в Java, но это возможно.

8 голосов
/ 17 июля 2009

К сожалению, нет.

Аналогичным понятием в мире Java является Isolate, впервые появившийся в JSR 121. Это был API для будущей функции JVM, которая обеспечила бы безопасное разделение и связь между различными приложениями, работающими в одной и той же JVM. После публикации JSR (около 2004 г.) одна исследовательская группа в Sun работала над проектом в Барселоне. Этот проект пытался реализовать API изоляции в виртуальной машине Sun HotSpot 1.5. Через два года они выпустили прототип для SPARC / Solaris. Версии для Windows / Linux никогда не выпускались из-за проблем со стабильностью.

Недавно SUN представила ограниченную версию API изоляции для J2ME, сосредоточив внимание на предложении «нескольких процессов» в средах, которые их не предлагали активно. Недавно мы также спросили у Sun их статус в реализации API-интерфейса Isolate для стандартных JVM, и они ответили, что планируют выпустить JVM с ограниченной поддержкой. Они планируют предложить возможность загружать / выгружать изоляты, но без возможности общаться между ними.

Кроме того, существовал старый способ поиска версии JVM, совместимой с Isolates, под названием JanosVM (java 1.1), но я сомневаюсь, что она может пригодиться сегодня.

Надеюсь, это поможет ...

0 голосов
/ 29 июня 2009

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

Это работает довольно хорошо, если:

а). Запросы от пользователей распространяются вокруг большего набора JVM. б). Все запросы не имеют состояния или имеется возможность репликации состояния. Репликация - это возможность WebSphere и WebLogic, я полагаю, что такая возможность есть и на других серверах приложений.

В таких средах нет необходимости «медленно» перемещать людей на другие серверы. Нам просто нужно знать, что мы можем безопасно остановить любую подачу / JVM и что эти сеансы будут запущены в другом экземпляре.

...