4

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

<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>
4

6 回答 6

10

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

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

参考

于 2013-09-07T14:02:36.327 回答
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>

有关更多详细信息,请查看在分叉的 JVM 中运行 Jetty

而且...在开始之前,请确保您确实拥有 2048 MB 的可用 RAM。

于 2013-09-09T10:01:46.420 回答
1

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

于 2013-09-09T05:58:03.040 回答
0

我最终得到一个 java.lang.OutOfMemoryError: PermGen space error

最终要多久?Web 应用程序之一是否因更改而频繁重新部署?

重新部署 Web 应用程序时很容易泄漏类。我会将此设置添加到 MAVEN_OPTS 来运行 maven

-XX:+HeapDumpOnOutOfMemoryError

运行直到出现内存不足错误,然后使用eclipse mat加载转储并查看什么填充了您的 perm gen。您的 Web 应用程序很可能在 redeploy 上泄漏了类

于 2013-09-09T05:38:49.523 回答
0

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

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

或者

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

设置环境变量:

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

从资源编译数据

于 2013-09-09T05:44:08.753 回答
0

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

<jvmArgs>-Xmx1400m -Xms1400m</jvmArgs>
于 2013-09-09T08:14:55.983 回答