4

我有一个要部署到 Jboss EAP 6.1 的 EAR 项目。我的 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 空间:java.lang.OutOfMemoryError:PermGen 空间”。我厌倦了将我的 PermGen 内存增加到 700MB,但没有运气。所以我怀疑 hotswap-agent 正在监视我 EAR 中的所有类,包括 lib 目录中的类,这导致它消耗了太多内存。

我研究的下一个地方是默认禁用热交换,方法是在 hotswap-agent.properties 中放置 autoHotswap=false。如上所示,我尝试将此文件放置在 EAR 以及 EJB 和 WAR 类路径中,但没有任何区别。我也尝试过像这样添加到 JVM_OPTS 中,但无济于事:

-javaagent:/workspace/tools/hotswap-agent-1.0.jar=disablePlugin=Deltaspike,disablePlugin=JavaBeans,autoHotswap=false"

所以我的问题是,如何在我的环境中控制热插拔代理?还有一种方法可以只查看指定包中的类,比如“com.foobar”吗?最后,为 jboss 上的 ear 部署配置 hotswap-agent 的正确方法是什么。

4

1 回答 1

3

在Vladimirhotswap-agent forum的帮助下,终于让 hotswap-agent 在我的项目中工作了。他所说的这有助于解决失控的 PermGen 内存:

JBossAS 为每个模块(如 jar、war 等)提供了单个类加载器。因此,在运行的 JbossAS 中可能有很多模块类加载器。除了 HotswapAgent 将它的类复制到每个模块类加载器(这是必要的,否则 HotswapAgent 在模块类加载器中不起作用)。因此,JVM 可以多次加载同一个 HotswapAgent 的类!至于全球禁用插件的复制,这是一个bug,我们应该修复它。您可以直接从 hotswap-agent.jar 中删除未使用的插件作为一种解决方法,它应该有助于提高性能。

一旦我从 jar 中删除了不需要的插件,我就可以在合理的时间和 PermGen 内存中启动 jboss。

于 2017-04-14T13:36:06.663 回答