Java AppDomain как абстракция?

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

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

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

Любые предложения?

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Это работает довольно хорошо, предполагая:

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

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