Java AppDomain похож на абстракцию?

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

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

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

Какие-либо предложения?


person Bob Albright    schedule 29.06.2009    source источник


Ответы (3)


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

person Todd Stout    schedule 12.09.2009
comment
Вы правы. Спасибо за ответ. - person Bob Albright; 13.09.2009

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

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

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

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

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

person Yiannis    schedule 17.07.2009

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

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

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

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

person djna    schedule 29.06.2009
comment
Спасибо за ваш комментарий. К сожалению, мое веб-приложение в настоящее время не является апатридом, и репликация невозможна, поскольку сеанс не сериализуем. Возможно, мне было бы лучше всего сделать все там сериализуемым. - person Bob Albright; 29.06.2009