Пути к классам Webapp и классы, загружаемые в кучу - PullRequest
0 голосов
/ 17 января 2011

Если у меня есть два веб-приложения, оба из которых имеют одинаковые сторонние библиотеки jar в своих каталогах web-inf / lib, скажем, log4j ..... когда загружается первое веб-приложение и создается класс log4j, этот классзагружается в кучу.Когда второе веб-приложение загружается и пытается загрузить класс log4j, он найдет класс в куче и будет использовать его?Или он загрузит свою собственную копию класса в кучу?

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Хм Я думаю, что это в основном проблема ClassLoader, она все еще зависит от сервера приложений, который вы используете, но я думаю, что большинство из них используют одну JVM и резервируют ClassLoader для каждого запущенного веб-приложения, чтобы вы могли иметь другое разные версии одного и того же jar / clase, работающие вместе.

Например, в tomcat, если вам нужно иметь некоторые общие библиотеки, вы можете использовать папку / tomcat / shared / lib, в которую вы помещаете все файлы jar, которые будут доступны всем вашим веб-приложениям.

В противном случае да, другое веб-приложение не будет использовать одну и ту же кучу, это будет означать, что веб-приложение может получить доступ к объекту, созданному другим веб-приложением, работающим на том же сервере приложений

1 голос
/ 17 января 2011

Нет, не должно.

То, что классы загружаются в кучу, здесь ничего не значит. так как каждый загрузчик классов поддерживает свой список загруженных классов.

Однако, загрузчики классов также организованы в дерево, и они должны попросить своих родительских загрузчиков классов сначала попытаться загрузить класс, как описано в javadoc класса ClassLoader.

Класс ClassLoader использует модель делегирования для поиска классов и ресурсов. Каждый экземпляр ClassLoader имеет связанный родительский загрузчик классов. При запросе на поиск класса или ресурса экземпляр ClassLoader делегирует поиск класса или ресурса своему загрузчику родительского класса, прежде чем пытаться найти сам класс или ресурс.

Однако веб-серверы обычно не следуют этой модели делегирования, чтобы избежать использования библиотек, используемых самим веб-сервером, веб-приложениями. (Такое поведение иногда настраивается, но зависит от используемого веб-сервера.)

Таким образом, на практике каждое веб-приложение должно иметь свое отдельное пространство классов, независимое от всех других веб-приложений, поэтому они могут без проблем использовать две разные версии одной и той же библиотеки.

Другим важным уроком является то, что один и тот же файл классов, загружаемый двумя разными загрузчиками классов, фактически будет двумя отдельными классами в куче, и объекты одного класса не будут совместимы с другим классом.

...