两个Web应用程序之间共享实例时Maven Jetty插件OutOfMemoryError

时间:2013-09-07 03:20:40

标签: java maven jetty

我正在使用maven jetty插件来运行我的两个Web应用程序。一个Web应用程序是spring mvc UI,另一个是RESTful Web应用程序。当我运行两个单独的mvn jetty时,我能够让两个Web应用程序进行通信:运行实例并分配不同的端口。我已使用下面的maven pom.xml配置使用相同的端口在同一个jetty实例中成功部署。我最终得到一个ava.lang.OutOfMemoryError:PermGen空间错误。对此最好的解决方法是什么?

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>7.6.8.v20121106</version>
    <configuration>
        <jvmArgs>-Xmx2024m -Xms2024m</jvmArgs>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <webApp>
            <contextPath>/</contextPath>
        </webApp>
        <contextHandlers>           
            <contextHandler implementation="org.eclipse.jetty.webapp.WebAppContext">
                <war>../../api/target/main-api.war</war>
                <contextPath>/test</contextPath>
            </contextHandler>
        </contextHandlers> 
    </configuration>
</plugin>

6 个答案:

答案 0 :(得分:10)

添加以下jvm参数,如果收到有关无法分配内存的错误,请尝试使用较小的值(128和256)

-XX:PermSize=256M -XX:MaxPermSize=512M

参考

答案 1 :(得分:2)

尝试以分叉模式运行Jetty,如下所示:

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>7.6.8.v20121106</version>
    <executions>
        <execution>
          <id>start-jetty</id>
          <!-- Set this to the appropriate phase:
               pre-integration-test, or earlier test-compile-->
          <phase>pre-integration-test</phase>
          <goals>
             <goal>run-forked</goal>
          </goals>
       </execution>
    </executions>

    <configuration>
        <jvmArgs>-Xmx2048m -Xms1536m -XX:PermSize=128m -XX:MaxPermSize=256m</jvmArgs>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <webApp>
            <contextPath>/</contextPath>
        </webApp>
        <contextHandlers>           
            <contextHandler implementation="org.eclipse.jetty.webapp.WebAppContext">
                 <war>../../api/target/main-api.war</war>
                <contextPath>/test</contextPath>
            </contextHandler>
        </contextHandlers> 
    </configuration>
</plugin>

有关详细信息,请查看Running Jetty in a forked JVM

并确保在开始之前确实有2048 MB的可用内存。

答案 2 :(得分:1)

尝试使用Plumbr诊断您的网络应用程序的任何内存泄漏问题。 http://plumbr.eu/

答案 3 :(得分:0)

  

我最终得到一个java.lang.OutOfMemoryError:PermGen空格错误

最终会持续多久?是否因为更改而频繁重新部署的webapp之一?

重新部署Web应用程序时,很容易泄漏类。我将maven添加到MAVEN_OPTS

这个设置

-XX:+ HeapDumpOnOutOfMemoryError

运行直到出现内存不足错误,然后使用eclipse mat加载转储并查看填充perm gen的内容。您的网络应用最有可能是leaking classes on redeploy

答案 4 :(得分:0)

这取决于哪个JVM实例需要更多内存。例如,如果测试是分叉的(默认情况下),并且由于OutOfMemoryError而失败,那么请尝试启动它们的configure插件:

   <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <argLine>-Xmx1024m</argLine>
        </configuration>
    </plugin>

OR

除堆内存外。您还必须增加perm大小以解决maven中的异常在环境变量中使用这些变量。并且有时也可以扩展perm内存大小 -

设置环境变量:

  

变量名:MAVEN_OPTS变量值:-Xmx512m -XX:MaxPermSize = 256m

来自resource

的已编译数据

答案 5 :(得分:0)

请说明:您使用的是什么jvm版本,您使用的操作系统,计算机上安装了多少物理内存。如果你将你的内存需求减少到1400M会发生什么情况(如果你在32位jvm上运行会有所帮助),即:

<jvmArgs>-Xmx1400m -Xms1400m</jvmArgs>