通过调整JVM的最大堆内存(-Xmx)参数,直接扩大编译时可用的内存空间。
-J-Xmx参数,例如分配2GB内存:javac -J-Xmx2g YourJavaFile.java(多文件或目录编译时同理,如javac -J-Xmx2g -d bin src/**/*.java)。~/.m2/settings.xml的<profiles>中配置maven.compiler.jvmArgs,或在命令前设置MAVEN_OPTS环境变量:<!-- settings.xml配置 -->
<settings>
<profiles>
<profile>
<id>default</id>
<properties>
<maven.compiler.fork>true</maven.compiler.fork>
<maven.compiler.jvmArgs>-Xmx2g</maven.compiler.jvmArgs>
</properties>
</profile>
</profiles>
</settings>
或命令行执行:export MAVEN_OPTS="-Xmx2g" && mvn clean install。gradle.properties中设置org.gradle.jvmargs:org.gradle.jvmargs=-Xmx2g(Gradle会自动应用该配置到编译任务)。若物理内存不足,可通过创建交换文件(Swap)扩展虚拟内存,缓解内存压力。
# 创建4GB交换文件(可根据需求调整大小,如2G则count=2048)
dd if=/dev/zero of=/swapfile bs=1M count=4096
# 设置文件权限(仅root可读写)
chmod 600 /swapfile
# 格式化为Swap分区
mkswap /swapfile
# 启用Swap
swapon /swapfile
# 持久化配置(重启后生效)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
fallocate命令快速创建(需root权限):sudo fallocate -l 4G /swapfile # 创建4GB交换文件
sudo chmod 600 /swapfile # 设置权限
sudo mkswap /swapfile # 格式化
sudo swapon /swapfile # 启用
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 持久化
swapon --show或free -h,查看Swap分区是否显示并分配了指定大小。top或htop命令查看内存占用高的进程(如浏览器、大型软件),通过kill -9 <PID>终止无用进程,释放内存。<dependency>中不必要的scope为compile的库),减少编译时的内存消耗。对于大型项目,将代码拆分为多个独立模块(如Maven的<module>或Gradle的subprojects),分模块依次编译(如mvn compile -pl module1,module2 -am),避免一次性加载全部代码导致内存溢出。
java -version确认JDK位数,若为32位,下载并安装64位JDK(如OpenJDK 11+或Oracle JDK 11+)。java -version检查版本,使用yum install java-11-openjdk-devel(CentOS)升级至Java 11。通过启用GC日志分析内存回收情况,优化GC配置。例如,在编译命令中添加以下参数,生成GC日志文件gc.log:
javac -J-Xmx2g -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log YourJavaFile.java
编译完成后,使用less gc.log或GC分析工具(如GCViewer)查看日志,判断是否存在频繁Full GC或内存回收缓慢的问题,进而调整GC策略(如切换至G1收集器:-XX:+UseG1GC)。