EC2 t2.micro实例部署SonarQube 6.0启动失败:Java内存不足
从你的日志和系统内存信息来看,问题根源很明确:你的t2.micro实例只有1GB物理内存,而SonarQube默认配置的JVM最大堆内存(-Xmx1G)几乎占满了全部内存,再加上系统本身和MySQL的内存开销,直接导致JVM无法分配足够的内存启动。
下面是具体的解决步骤:
1. 调整SonarQube的JVM内存配置
SonarQube有两个核心进程(Web服务和搜索服务)都需要内存分配,我们需要分别降低它们的内存上限:
修改Wrapper全局JVM参数
编辑SonarQube的Wrapper配置文件:
sudo vi /opt/sonarqube/conf/wrapper.conf
找到默认设置为1024MB的内存配置行:
wrapper.java.maxmemory=1024
将其修改为更适合t2.micro的数值,比如384MB:
wrapper.java.maxmemory=384
修改搜索服务的内存参数
编辑SonarQube的主配置文件:
sudo vi /opt/sonarqube/conf/sonar.properties
找到sonar.search.javaOpts配置项,默认包含-Xmx1G,把它改成-Xmx256m,修改后的配置类似:
sonar.search.javaOpts=-Xmx256m -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError
小提示:把
-Xms和-Xmx设成相同值,能避免JVM频繁调整堆内存,节省系统资源。
2. 优化MySQL的内存占用(可选但推荐)
因为MySQL也运行在同一个t2.micro实例上,它会占用不少内存。编辑MySQL的配置文件(通常是/etc/my.cnf),降低内存相关参数:
sudo vi /etc/my.cnf
在[mysqld]段添加或修改以下参数:
innodb_buffer_pool_size=128M key_buffer_size=32M query_cache_size=8M
保存后重启MySQL:
sudo service mysqld restart
3. 验证启动
先确保之前的SonarQube进程完全停止:
sudo ./sonar.sh stop
然后启动SonarQube:
sudo ./sonar.sh start
之后查看日志确认是否启动成功:
tail -f /opt/sonarqube/logs/sonar.log
为什么这样有效?
t2.micro实例的总内存只有约1GB,系统本身会占用100-200MB,MySQL默认配置可能占用300-500MB,留给SonarQube的内存本来就不多。通过降低SonarQube的JVM堆内存,给系统和MySQL留出足够的空间,就能让JVM成功分配内存启动服务。
内容的提问来源于stack exchange,提问作者kalyan

