声纳 - OutOfMemoryError:Java堆空间

26
我正在使用"Findbugs"配置文件将一个大型Java项目部署到Sonar上,但是遇到了以下错误:
Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:
Java heap space

我尝试了以下方法来解决这个问题:

  1. 在sonar-runner批处理文件中,用-Xms256m -Xmx1024m替换%SONAR_RUNNER_OPTS%,以增加堆大小。
  2. 将"sonar.findbugs.effort"参数设置为Sonar全局参数中的"Min"。

但是上述两种方法都没有对我起作用。

8个回答

15

我曾经遇到同样的问题,并找到了一个非常不同的解决方案,可能是因为我很难接受之前的答案/评论。如果您有100个字符每行(一个疯狂的尺寸),那么您可以将整个代码库加载到1GB内存中。我将其设置为8GB内存,但仍然失败了。为什么呢?

答案:因为社区Sonar C++扫描器似乎存在一个错误,它会捕捉任何文件名包含字母“ c”的文件。这包括.doc、.docx、.ipch等。因此,它耗尽内存的原因是因为它试图读取一些文件,它认为这是纯代码300MB,但实际上应该忽略它。

解决方案:查找项目中使用的所有文件的扩展名(在此处查看更多信息):

dir /s /b | perl -ne 'print $1 if m/\.([^^.\\\\]+)$/' | sort -u | grep c

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

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

然后将您的内存限制恢复到正常水平。

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

14

这个对我起作用:

SONAR_RUNNER_OPTS="-Xmx3062m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m"

我直接在sonar-runner(.bat)文件中设置它


对我来说,它给出的是**无效的最大堆大小:-Xmx512m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m无法创建Java虚拟机。** - Denim Datta
2
从传递的值中删除“=”。 - adnan kamili
5
如果您正在使用 SonarQube Scanner 2.5+ 并且运行在 Linux 上,可以将以下代码导出至终端:export SONAR_SCANNER_OPTS="-Xmx3062m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m" - zacran
1
export SONAR_SCANNER_OPTS="-Xmx3062m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m" 这段代码是关于设置Sonar Scanner的选项,用于控制内存和代码缓存大小。此代码在Windows上也可以使用,如@zacran所述。 - posix99

7

当我使用maven运行sonar时,遇到了同样的问题。在我的情况下,单独调用sonar有所帮助:

mvn clean install && mvn sonar:sonar

而不是

mvn clean install sonar:sonar

http://docs.sonarqube.org/display/SONAR/Analyzing+with+Maven

备注:因为我的解决方案连接到了Maven,所以这不是直接回答问题的答案。但它可能会帮助其他遇到此问题的用户。


如果您正在使用Maven并且仍然遇到此问题:export MAVEN_OPTS="-Xms256m -Xmx1024m" - kinjelom

2
我知道这个帖子有点旧了,但这些信息可能对某些人有所帮助。
对我来说,问题并不像顶部答案中的C++插件所建议的那样。相反,我的问题是Xml-Plugin(https://docs.sonarqube.org/display/PLUG/SonarXML),在我停用它后分析工作正常了。

当前(假设是最新的代码库)SonarCloud中不存在该选项...? - user5248982

2
你可以首先使用一些Findbugs规则创建自己的质量配置文件,然后逐步添加更多规则,直到出现OutOfMemoryError。可能只有一个规则使所有这些失败,因为你的代码违反了它 - 如果你停用此规则,它肯定会起作用。

1
你可以通过增加相应Java进程的-Xmx内存设置,增加分配给该进程的最大内存来解决此问题,在SonarQube/conf/sonar.properties下,取消以下行的注释并根据需要增加内存:
For Web: Xmx5123m -Xms1536m -XX:+HeapDumpOnOutOfMemoryError
For ElasticSearch: Xms512m -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError
For Compute Engine: sonar.ce.javaOpts=-Xmx1536m -Xms128m -XX:+HeapDumpOnOutOfMemoryError

0

我知道这已经过时了,但我还是要发表我的答案。我意识到我正在使用32位的JDK(版本8),在卸载它并安装64位的JDK(版本12)后,问题消失了。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接