SonarQube 6.7.7内存溢出及JDK路径配置无效问题求助
咱们一步步来拆解你的问题,先把JDK配置的坑填上,再解决GC过载的OOM问题:
一、强制让SonarQube使用指定JDK运行
你已经尝试修改wrapper.conf和JAVA_HOME但没生效,大概率是配置没真正落地,或者启动时被其他环境变量覆盖了,按下面的顺序排查:
确认wrapper.conf的修改正确且生效
打开$SONAR_HOME/conf/wrapper.conf,检查wrapper.java.command的路径是否指向JDK目录下的java可执行文件(不是JRE的)。比如正确路径应该是类似wrapper.java.command=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/bin/java,根据你的实际JDK路径调整。
重点:修改后必须完全停止SonarQube再重启,别用restart命令——先执行ps aux | grep sonar确认所有相关进程都被杀死,再启动服务,避免旧进程残留导致配置没加载。排查系统环境变量的优先级
有些系统中,SonarQube的启动脚本可能优先读取系统的JAVA_PATH或其他环境变量,而非wrapper.conf的配置。你可以试试:在启动SonarQube前,先在当前终端执行export JAVA_HOME=/path/to/your/jdk,然后直接在这个终端启动SonarQube,看是否会使用指定JDK。
如果这样生效了,说明你需要把JAVA_HOME配置加到SonarQube的启动脚本里(比如$SONAR_HOME/bin/linux-x86-64/sonar.sh),在脚本开头添加export JAVA_HOME=/path/to/your/jdk,确保启动时加载正确的环境变量。验证是否真的用了JDK
启动SonarQube后,用ps aux | grep sonar找到进程ID,再执行lsof -p <进程ID> | grep java,查看该进程使用的java可执行文件路径,确认是不是JDK目录下的。
或者直接看sonar.log,找包含“Java Home”的日志行,确认显示的是JDK路径而非JRE。
二、解决GC Overhead Limit Exceeded的OOM问题
单纯调大堆内存没效果,说明得从GC策略、内存占用根源入手:
分析堆转储文件找内存占用根源
你已经生成了java_pid21155.hprof堆转储文件,用JDK自带的jhat工具或者可视化工具(比如VisualVM、Eclipse Memory Analyzer)打开它,重点看:- 是不是有大量未完成的分析任务堆积,导致Compute Engine内存无法释放?
- 有没有内存泄漏的对象(比如被长期持有、无法被GC回收的对象)?
命令示例:jhat java_pid21155.hprof,然后访问http://localhost:7000查看分析结果。
针对性调整JVM GC参数
除了堆内存,GC策略对这类问题影响很大。给Web Server和Compute Engine的JVM参数加上G1GC配置(大内存场景下G1GC比默认ParallelGC效率更高):sonar.web.javaOpts=-Xmx8G -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled sonar.ce.javaOpts=-Xmx8G -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled另外Elasticsearch 6.x也推荐用G1GC,调整它的参数:
sonar.search.javaOpts=-Xms6G -Xmx6G -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:MaxGCPauseMillis=200检查SonarQube的任务负载
看看是不是近期提交了大量代码分析任务,导致Compute Engine和Web Server内存压力过载。可以登录SonarQube后台,进入「Administration > System > Tasks」查看任务队列,有没有堆积的任务。
如果任务太多,可以先暂停部分非紧急任务,或者调整并发分析参数sonar.ce.workerCount(默认是1)——根据服务器CPU核心数调整,比如改成2或4,但别超过CPU核心数的一半,避免CPU过载拖慢GC效率。排查第三方插件的内存泄漏
有些旧版本的第三方插件可能存在内存泄漏问题。你可以尝试禁用非必要的插件,重启服务后观察问题是否消失,逐步排查出有问题的插件,然后升级到兼容SonarQube 6.7.7的最新版本。
内容的提问来源于stack exchange,提问作者user4948798

