[SonarQube]Scanners(MSBuild)执行扫描时出现内存不足SonarQube java.lang.OutOfMemoryError: GC overhead limit exceeded

最近在新的项目CI流程内开始加入声纳(SonarQube)来进行程序分析,希望能获得海面下更多有关程序品质度量的指针。从Jenkins以Command Line执行大型程序库扫描时,却出现了内存不足的异常,不过小型程序库则可以正常完成扫描。

进入疑难排解阶段,我们先确认服务器内存是充足无虞的,不过观察扫描程序在大型程序库执行时,只吃到1G多一点就出现内存不足的异常。笔记解题方法。



案例现场采证

案发地点在Step 3-4,CI Server(Jenkins)执行扫描时:

图片来源: https://docs.sonarqube.org

现场采证:  "CHECKPOINT_WRITER"  java.lang.OutOfMemoryError: GC overhead limit exceeded

在现场也采证到案发前,启动Post-processing时的证物,由于没有设定SONAR_SCANNER_OPTS,默认值-Xmx1024m

还原现场,执行扫描时

执行第二次的错误消息也是内存不足,但发生的thead变成在CLEANUP_MANAGER


解决方法

在执行程序分析前,如下的命令码,设定变量SONAR_SCANNER_OPTS=-Xmx8192m

set SCA="C:COCAsonarQubesonar-scanner-msbuild-4.3.1.1372-net46SonarQube.Scanner.MSBuild.exe"
set MSBUILD="C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0BinMSBuild.exe"
set SONAR_SCANNER_OPTS=-Xmx8192m
CD C:RDPayGateWayWeb
%SCA% begin /k:"org.sonarqube:sonarqube-scanner-msbuild" /n:"PayGateWayWeb" /v:"1.0"
%MSBUILD% /t:Rebuild
%SCA% end

Post-processing 启动后,成功载入最大内存8GB的限制

内存吃超过1GB,突破盲肠了

SonarQube Scanner 成功完成扫描,分析结果成功发布到SQ(SonarQube) Server。

打开SQ网站,技术债43天,还有许多的Code Smells。


技术债的天数计算

The value of the cost to develop a line of code is 0.06 days.

文档上说明修改一行技术债的程序大约要30分钟,不过实际跑出来的有5分钟、10分钟,幸好他没有算利息。


小结

  • 项目先从Blocker、Critical等级开始还债,欢迎加入还债人生Part2
  • 别忘了SQ Server也要放大Web (including embedded web server)、Compute Engine及ElasticSearch的内存上限。

在sonar.properties文件加入以下设定:

sonar.web.javaOpts =-Xmx8192m -Xms512m -XX:MaxPermSize=8192m
sonar.ce.javaOpts =-Xmx8192m -Xms512m -XX:MaxPermSize=8192m
sonar.search.javaOpts =-Xmx8912m -Xms512m -XX:MaxPermSize=8192m

SQ Server内部架构

2018.02 旧金山 Cable car路线


参考

SONAR Architecture and Integration

SONAR Install the SonarScanner for MSBuild

SONAR Metric Definitions