Это действительно очень типичная ошибка, когда вы хотите использовать Java EE с простым контейнером сервлетов, который не предназначен для этого;)
Нет, просто шучу. Tomcat поставляется с настройкой по умолчанию permgen всего 64 МБ. Среди прочего там хранятся определения Class
(т. Е. Все, что вы получаете, когда делаете Class#forName()
). Грубо говоря, Weld сканирует каждый один JAR и класс в classpath, чтобы найти аннотации, чтобы он мог программно создать отображение памяти конфигурации проводки (до аннотаций это обычно выполнялось файлами XML). Однако наличие множества классов в пути к классам и загрузка такого количества классов оставляет очень мало места в постоянном пространстве для горячих развертываний Tomcat.
Есть несколько способов обойти это. Наиболее логичным способом было бы увеличить пространство permgen. Вы можете установить его в качестве аргумента VM. 256 МБ - хорошее начало.
-XX:MaxPermSize=256m
Если вы используете Tomcat из Eclipse, вам необходимо установить его, дважды щелкнув запись сервера в представлении Серверы , щелкнув Открыть конфигурацию запуска , щелкнув Аргументы , а затем добавьте ее (через пробел) в поле VM Arguments .
Кроме того, вы также можете заставить JVM быть более осторожным с пространством permgen. Объекты там по умолчанию редко выгружаются. Добавьте следующие аргументы VM.
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Смотри также: