11

我正在 Jenkins 构建服务器上构建一个 Maven Java 应用程序。我java.lang.OutOfMemoryError: PermGen space在 Jenkins 上构建期间遇到了很多次(但从来没有在我的本地主机上),因此它使我的构建失败。

我已经尝试过MAVEN_OPTS为 Jenkins 设置:我进入Jenkins--> Manage Jenkins--> Configure system-->Global MAVEN_OPTS并将其设置为-Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:PermSize=512m. 尽管将其设置为如此高的值,但我们仍会遇到 PermGen 空间问题。我不想将 MAVEN_OPTS 设置为更高的值;我看不出我的应用程序如何需要大量空间,我宁愿深入研究高内存使用问题。

最近,我一直在想,permgen 空间问题可能不是来自 Maven 本身,而是来自 Maven 衍生的 JVM 进程之一(例如:插件)。我提出这个假设是因为 Maven 仍然能够正常执行 TestNG 测试,尽管已经吐出了我们的 permgen 空间错误行。导致 PermGen 错误的插件之一是Jetty:

Oct 31, 2012 7:55:37 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: handle failed
java.lang.OutOfMemoryError: PermGen space

因此,我想知道:

MAVEN_OPTS变量是否也适用于 Maven 构建衍生的子 JVM 进程?如果没有,那么如何为这些子进程(例如 Jetty)设置 JVM 选项?

注意:我使用的是 Maven 3.0.4。

4

3 回答 3

7

大多数生成 Java 进程的 Maven 插件都有自己的方式来指定 JVM 命令行参数。例如,您可以使用argLine配置参数在 Surefire 插件生成的进程中配置堆和永久生成大小(请参阅http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#argLine)。

Jetty 插件不会产生进程,因此 heap 和 permgen 由提供给 Maven 进程的 JVM 参数控制。

如果从 Jenkins 运行时内存不足,但在本地运行时没有,请检查 Jenkins 传递给 Maven 的 MAVEN_OPTS。

于 2012-11-04T10:08:09.053 回答
1

您可以全局配置 vm 选项(设置)并为任何构建作业覆盖它。例如,在基于 Maven 的作业中,MAVEN_OPTS 字段隐藏在“高级”块之一中。

于 2012-10-31T15:39:00.777 回答
1

正如前面另一个回复所提到的,每个进程都有自己指定参数的方式。如果 Jenkins 生成了 Maven 子进程,该设置将在 Maven 构建下的作业配置中。您需要单击“高级”按钮并在MAVEN_OPTS字段中设置选项。例如:-XX:MaxPermSize=256m -Xms512m -Xmx1024m

于 2012-11-29T18:34:22.603 回答