4

我正在使用 Sonar Runner 2.2 和 set 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

怎么会这样?

4

3 回答 3

2

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

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

解决方案:查找项目中所有文件使用的扩展名(请参见此处)。

然后将这些其他扩展作为排除项添加到您的 sonar.properties 文件中:

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

然后将内存限制设置回常规数量:

%JAVA_EXEC% -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m %SONAR_RUNNER_OPTS% ...
于 2013-12-09T22:04:02.907 回答
1

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

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

于 2013-06-24T10:18:48.167 回答
0

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

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

这个<argLine>标签,我们可以使用 in<maven-surefire-plugin>或 in <properties>。使用 in section 的优点是,测试用例和声纳都可以使用相同的配置。请在此处查找参考。

于 2016-05-04T19:09:38.840 回答