Hotswap-агент на JBoss EAP 6.1 - java.lang.OutOfMemoryError: пространство PermGen
У меня есть проект EAR, который я развертываю в Jboss EAP 6.1. Продукт моей сборки Maven выглядит так:
myapp-ear
├── myapp-ejb.jar
├── myapp-web.war
├── lib
│ ├── activation.jar
│ ├── activiti-bpmn-converter.jar
│ ├── activiti-bpmn-model.jar
.....
│ ├── xml-apis.jar
│ └── xmlbeans.jar
└── META-INF
├── application.xml
├── hotswap-agent.properties
├── myapp-ds.xml
├── jboss-deployment-structure.xml
└── MANIFEST.MF
Вот что я получаю в журнале jboss при развертывании моего приложения:
21:34:55,570 INFO [stdout] (MSC service thread 1-5) HOTSWAP AGENT: 21:34:55.569 INFO (org.hotswap.agent.config.PluginRegistry) - Plugin 'org.hotswap.agent.plugin.jbossmodules.JBossModulesPlugin' initialized in ClassLoader 'ModuleClassLoader for Module "deployment.myapp-ds.xml:main" from Service Module Loader'.
21:35:04,357 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015876: Starting deployment of "null" (runtime-name: "myapp-web.war")
21:35:04,357 INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) JBAS015876: Starting deployment of "null" (runtime-name: "myapp-ejb.jar")
21:35:04,781 INFO [org.jboss.as.jpa] (MSC service thread 1-3) JBAS011401: Read persistence.xml for myproject
21:35:05,306 INFO [stdout] (MSC service thread 1-7) HOTSWAP AGENT: 21:35:05.306 INFO (org.hotswap.agent.config.PluginRegistry) - Plugin 'org.hotswap.agent.plugin.jbossmodules.JBossModulesPlugin' initialized in ClassLoader 'ModuleClassLoader for Module "deployment.myapp-ear.ear:main" from Service Module Loader'.
а также
21:35:05,488 INFO [stdout] (MSC service thread 1-6) HOTSWAP AGENT: 21:35:05.487 INFO (org.hotswap.agent.config.PluginRegistry) - Plugin 'org.hotswap.agent.plugin.hotswapper.HotswapperPlugin' initialized in ClassLoader 'ModuleClassLoader for Module "deployment.myapp-ear.ear.myapp-web.war:main" from Service Module Loader'.
21:35:05,520 INFO [stdout] (MSC service thread 1-4) HOTSWAP AGENT: 21:35:05.517 INFO (org.hotswap.agent.config.PluginRegistry) - Plugin 'org.hotswap.agent.plugin.jbossmodules.JBossModulesPlugin' initialized in ClassLoader 'ModuleClassLoader for Module "deployment.myapp-ear.ear.myapp-ejb.jar:main" from Service Module Loader'.
Проблема заключается в том, что при развертывании моего уха в jboss это занимает примерно 10 раз больше обычного времени, и когда я пытаюсь получить доступ к приложению из браузера, оно выдает "PermGen space: java.lang.OutOfMemoryError: PermGen space". Я устал от увеличения памяти PermGen до 700 МБ, но не повезло. Поэтому я подозревал, что hotswap-agent наблюдает за всеми классами в моем EAR, включая те, что находятся в каталоге lib, что приводит к тому, что он занимает слишком много памяти.
Следующее место, на которое я обратил внимание, это отключение горячей замены по умолчанию, поместив autoHotswap=false в hotswap-agent.properties. Я попытался поместить этот файл в EAR, как показано выше, и пути к классам EJB и WAR, но это не имело никакого значения. Я также попытался, но безрезультатно, добавить в JVM_OPTS примерно так:
-javaagent:/workspace/tools/hotswap-agent-1.0.jar=disablePlugin=Deltaspike,disablePlugin=JavaBeans,autoHotswap=false"
Итак, мой вопрос: как можно контролировать hotswap-агент в моей среде? Также есть ли способ смотреть только классы в указанном пакете, скажем, "com.foobar"? Наконец, как правильно настроить hotswap-agent для развертывания в ушах на jboss.
1 ответ
Наконец-то получил hotswap-agent, работающий в моем проекте с помощью Владимира на форуме hotswap-agent. Вот что он сказал, что помогло разгадать убогую память PermGen:
JBossAS имеет один classLoader для каждого модуля, такого как jar, war и т. Д. В этом случае может быть много загрузчиков классов модулей в работающем JbossAS. Наряду с этим HotswapAgent копирует свои классы в каждый из загрузчиков классов этого модуля (это необходимо, иначе HotswapAgent не работает внутри загрузчика классов модуля). Следовательно, один и тот же класс HotswapAgent может быть загружен JVM несколько раз! Что касается копирования плагина globaly отключен, это ошибка, мы должны это исправить. Вы можете просто удалить неиспользуемые плагины непосредственно из hotswap-agent.jar в качестве обходного пути, это должно помочь с производительностью.
После того, как я удалил ненужные плагины из банки, я мог запустить jboss в течение разумного времени и памяти PermGen.