Ubuntu下Java编译内存不足的排查与解决
一、快速判断与定位
free -h。若可用内存与Swap都接近耗尽,编译过程极易因OOM被终止。二、通用解决方案
JAVA_TOOL_OPTIONS="-Xms1g -Xmx4g" javac ...。JAVA_OPTS或_JAVA_OPTIONS,例如:export JAVA_OPTS="-Xms1g -Xmx4g";注意某些工具会忽略JAVA_OPTS,此时改用工具专用变量(如Maven的MAVEN_OPTS)。-Xms与-Xmx不宜超过物理内存的70%;在容器/低内存环境请相应下调。ulimit -a,关注max memory size与virtual memory;必要时放宽:ulimit -v unlimited(当前会话有效)。make -j2、gradle -j2、mvn -T 1C),可显著降低瞬时内存峰值。三、按构建工具给出的配置示例
export MAVEN_OPTS="-Xms2g -Xmx4g"(通常设为物理内存的约一半较稳妥,视机器而定)。mvn;必要时先mvn clean。gradle.properties中设置:org.gradle.jvmargs=-Xms2g -Xmx4g,并酌情降低org.gradle.parallel与org.gradle.workers.max。build/soong/java/config/config.go中将JavacHeapSize由2048M提升到4096M(或更高),保存后重启终端重新构建。四、系统层面的优化
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h查看Swap是否增加。注意:Swap能降低OOM概率,但会显著增加I/O时间。cat /sys/kernel/mm/transparent_hugepage/enabledecho never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled/etc/rc.local或系统服务以持久化(视发行版而定)。free -h、swapon --showdmesg | grep -i 'oom\|kill'jcmd <pid> VM.flags、jstat -gc <pid>)。五、常见误区与建议
JAVA_OPTS,需用专用变量(如MAVEN_OPTS)。-Xmx设置过大可能导致系统内存紧张并触发OOM Killer;通常不超过物理内存的**70%**更稳妥。-j或--parallel值,并适当增加Swap。-Xmx匹配,必要时提升容器配额或降低堆上限。