2010-10-26 108 views
5

我目前正在尝试使用哈德森构建我的项目来调用maven。我不断收到出于记忆错误的问题。我在所有环境变量,哈德森配置和哈德森项目配置中设置了xmx和xms。我将xmx设置为1500 mb,这应该足以满足整个项目小于1000mb的需求。用于构建项目的机器是存储该团队的Maven回购的服务器。奇怪的Maven内存不足错误

任何人都遇到了同样的问题?任何想法如何发生?

+0

您是否确认更改xmx/xms的确适用? – kukudas 2010-10-26 20:07:06

+0

我该怎么做? – Javabeginner 2010-10-27 09:40:56

回答

6

谢谢大家的回答我的问题。我已经通过堆转储和分析解决了这个问题。我通过传递以下虚拟机参数进行堆转储:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/

然后我用Eclipse Memory Analyser打开java_pidxxxxx.hprof文件。

我发现我们用来捕获异常的侦听器无法捕获异常。所以例外情况会留在虚拟机中,因此内存泄漏!

再次感谢所有的答案

0

假设你使用的是Sun的JDK,然后在哈德逊/管理哈德森/ Maven项目配置/全球MAVEN_OPTS设置如下:-Xmx512m -XX:MaxPermSize参数=256米

+0

我已经完成了。 – Javabeginner 2010-10-26 14:47:01

+0

从您的描述中不清楚你使用了哪些选项。这一切都区分大小写,你需要精确。这将有助于查看您正在收到的确切错误文本,例如它来自Hudson,是Maven发布的一个子进程的主Maven进程,用于运行测试和其他内容。 – 2010-10-26 14:54:31

0

哈德森揭开序幕单独的任务来运行Maven工作。您需要在MAVEN_OPTS文本字段中配置增加的内存。该字段位于各个作业配置窗口中。

编辑:继续您的意见。你是偶然分叉你的编译,运行它在一个单独的执行或叉你的junit测试。

尝试在你的编译器配置(假设你有一个):

<maxmem>512m</maxmem> 
+0

我已经完成了。 – Javabeginner 2010-10-26 14:47:48

+0

@Javabeginner看看我的编辑。也许这些信息可以帮助。 – 2010-10-26 15:43:05

+0

感谢您的更新,我确实尝试运行构建与睾丸分离,显然构建运行良好没有睾丸,我认为这是导致内存不足错误的测试。通过说睾丸,我们使用maven surefire插件来运行这些睾丸。我刚刚阅读了一篇文章,说Hudson,Maven,JBoss甚至窗口(运行我的服务器的操作系统)都可能无法支持xmx配置。我只是加倍检查,服务器有4GB内存和XMX设置为1500MB。编译器配置?这是否意味着我的案例Maven配置? – Javabeginner 2010-10-27 09:40:34

1

一定要确保你有足够的MaxPermSpace。我遇到了分配给JVM的内存已足够的问题,但OutOfMemoryError是由于PermSpace耗尽。当我们处理编译代码时,这并不罕见 - 尤其是编译代码,丢弃和重新编译时。有关调整垃圾收集器(和内存)的更多信息请查看这些参考资料:

在第16-17页的内存管理白皮书,它概述了可能的原因OutOfMemoryError异常。另一个防御是分叉maven进程和/或编译器。

+0

我确信,我得到的内存不足错误是不相关的permgen空间,因为我们实际上从这个错误从permgen空间错误 – Javabeginner 2010-10-26 16:34:37

+0

移动这是很难排除故障系统没有直接让我的手。我链接的文档是否帮助您找出要尝试的事情?你很可能将不得不在分析垃圾收集器的同时运行它来帮助你找到原因。文档告诉你如何做到这一点。 – 2010-10-26 18:36:49

11

如果您在测试过程中获得的OOM,那么你必须告诉万无一失插件一个新的虚拟机进行了检测:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.5</version> 
    <configuration> 
     <forkMode>once</forkMode> 
     <argLine>-Xms512m -Xmx512m</argLine> 
    </configuration> 
</plugin> 
+0

我刚刚在使用Vision VM的模块上完成了Java分析,通过将配置文件与其他模块进行比较,失败的模块似乎有很多睡眠线程,而其他模块没有。这是内存不足错误的原因吗? – Javabeginner 2010-10-27 13:11:54

+1

我们必须这样做,因为我们很多旧的单元测试没有清理他们使用的线程和其他资源。当我们询问蚂蚁脚本的作者时,他告诉我们分叉一个新的vm而不是固定单元测试更容易。 *感叹*这么多的技术债务。 – dhable 2010-10-27 20:09:26

+1

@Javabeginner:可能。您必须关闭所有文件,将所有引用设置为null,并将其测试在tearDown()中使用的任何内容清理干净:JUnit将为您的测试类*创建一个实例,并保留它们,直到所有测试都运行完毕。 – 2010-10-29 15:47:40

0

我得到了同样的问题。当试图对代码进行测试时,哈德森(或JVM)会抛出内存不足。解决方法是:在configuration of plugin cobertura-maven-plugin中,使用<maxmem>512m</maxmem>