通过调整JVM的最大堆内存(-Xmx参数),为编译过程分配更多内存。
-J-Xmx参数,例如分配2GB内存:javac -J-Xmx2g YourJavaFile.java
settings.xml(~/.m2/目录下),添加以下配置:<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=-Xmx2g
这会同时设置Gradle守护进程和编译任务的内存上限。若系统物理内存不足,可通过创建交换文件扩展虚拟内存,缓解内存压力。
sudo fallocate -l 2G /swapfile # CentOS 8推荐(更快)
# 或 sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 # CentOS 7
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
/etc/fstab,添加以下行:/swapfile none swap sw 0 0
swapon --show # 查看当前启用的交换空间
free -h # 查看内存与交换空间使用情况
注:交换空间虽能缓解内存不足,但性能远低于物理内存,建议仅在物理内存不足时临时使用。
编译时,关闭占用大量内存的后台程序(如浏览器、视频编辑软件、数据库服务等),释放更多内存供编译使用。
top或htop命令查看内存占用排名,终止高内存进程:top # 按“M”键按内存排序,找到占用高的进程
kill -9 <PID> # 终止指定进程(替换<PID>为实际进程ID)
使用高效的构建工具(如Maven、Gradle),并通过配置减少内存消耗:
pom.xml中配置maven-compiler-plugin,启用fork并设置内存:<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<fork>true</fork>
<meminitial>1024m</meminitial> <!-- 初始堆内存 -->
<maxmem>2048m</maxmem> <!-- 最大堆内存 -->
</configuration>
</plugin>
</plugins>
</build>
gradle.properties中的org.gradle.jvmargs,还可通过命令行临时调整:./gradlew build -Dorg.gradle.jvmargs="-Xmx2g"
构建工具的配置能避免全局环境变量影响,更精准地控制编译内存。对于大型项目,将代码拆分为多个模块(如Maven的<module>或Gradle的subprojects),分模块编译可减少单次编译的内存消耗。
pom.xml中定义模块:<modules>
<module>module1</module>
<module>module2</module>
</modules>
然后分别编译:mvn clean install -pl module1 -am # 编译module1及其依赖
mvn clean install -pl module2 -am # 编译module2及其依赖
分模块编译能降低单次内存峰值,提升编译稳定性。mvn dependency:analyze分析Maven依赖),减少编译时的内存加载量。jdk-11-linux-x64.bin)。以上方法可根据实际情况组合使用(如“增加JVM内存+分模块编译”“增加交换空间+关闭后台程序”),优先通过调整JVM参数和构建工具配置解决问题,若仍不足再考虑扩展系统资源。