JBoss EAP 6.1上的Hotswap-agent - java.lang.OutOfMemoryError:PermGen space

时间:2017-04-08 01:47:25

标签: maven ear jboss-eap-6 dcevm hotswapagent

我有一个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内存增加到700MB,但没有运气。所以我怀疑hotswap-agent正在观察我的EAR中的所有类,包括lib目录中的那些导致它消耗太多内存的类。

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

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

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

1 个答案:

答案 0 :(得分:3)

最后,在Vladimirhotswap-agent forum帮助下,我的项目中有hotswap-agent工作。他说这有助于解决失控的PermGen记忆:

  

JBossAS为jar,war等每个模块都有单个classLoader   该帐户在运行中可能有很多模块类加载器   JbossAS。与HotswapAgent一起将它的类复制到每个类中   模块类加载器(否则HotswapAgent不需要   在模块类加载器中工作)。因此,相同的HotswapAgent类   可以多次由JVM加载!至于复制全球   禁用插件,这是bug,我们应该修复它。你可以删除   直接来自hotswap-agent.jar的未使用的插件作为解决方法,它   应该有助于提高绩效。

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