无法执行Sonar:由以下原因引起:Java堆空间

时间:2013-06-24 08:48:34

标签: sonarqube sonar-runner

我正在使用Sonar Runner 2.2并设置SONAR_RUNNER_OPTS=-Xmx8000m,但我收到以下错误:

Final Memory: 17M/5389M
INFO: ------------------------------------------------------------------------
ERROR: Error during Sonar runner execution
ERROR: Unable to execute Sonar
ERROR: Caused by: Java heap space

这怎么可能?

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题并找到了一个非常不同的解决方案,也许是因为我不相信以前的任何答案/评论。拥有1000万行代码(比F16战斗机的代码更多),如果每行有100个字符(一个疯狂的大小),你可以将整个代码库加载到1GB的内存中。简单的数学。为什么8GB内存会失败?

答案:因为社区Sonar C ++扫描程序似乎有一个错误,它会在其扩展名中选择带有字母“c”的任何文件。这包括.doc,.docx,.ipch等。因此,它耗尽内存的原因是因为它试图读取一些它认为是300mb纯代码的文件,但实际上它应该被忽略。

解决方案:查找项目中所有文件使用的扩展程序(see here)。

然后在sonar.properties文件中添加这些其他扩展名作为排除项:

sonar.exclusions=**/*.doc,**/*.docx,**/*.ipch

然后将内存限制恢复为常规数量:

%JAVA_EXEC% -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m %SONAR_RUNNER_OPTS% ...

答案 1 :(得分:1)

如果您允许堆空间增长到8000米,这并不意味着您将始终拥有足够的物理内存来实现,因为您的操作系统上还运行了其他进程并消耗了内存。例如,如果您的计算机上只有“8GB”RAM,那么堆空间可能永远无法达到您设置的最大值。

顺便说一句,我不知道你要分析的是什么,但我从未见过有人需要这么多内存来分析项目。

答案 2 :(得分:0)

我在运行测试用例时遇到了同样的问题。在Visuval VM的帮助下,分析了在测试用例执行期间分配给PermGen的最小和最大内存,发现它为PermGen分配了80MB。因此,可以通过属性部分中的pom.xml管理相同内容,如下所示。

<properties>
    <argLine>-XX:PermSize=256m -XX:MaxPermSize=256m</argLine>
</properties>

<argLine>代码,我们可以在<maven-surefire-plugin><properties>中使用。在章节中使用的优点是,测试用例和声纳都可以使用相同的配置。请参考here