这是解决编译时内存不足的最直接方法。通过-J-Xmx参数调整JVM最大堆内存(如2GB),适用于命令行编译(javac)或构建工具配置:
javac命令后添加-J-Xmx参数,例如javac -J-Xmx2g YourJavaFile.java(2g表示2GB)。pom.xml的maven-compiler-plugin中配置maxmem(最大内存)和meminitial(初始内存),或在MAVEN_OPTS环境变量中设置(如export MAVEN_OPTS="-Xmx2g"),再运行mvn clean install。gradle.properties文件中添加org.gradle.jvmargs=-Xmx2g,Gradle会自动应用该内存设置。若系统物理内存不足,可通过创建Swap文件扩展虚拟内存(Swap是磁盘空间模拟的内存,用于缓解物理内存压力):
# 创建2GB Swap文件(bs×count=2GB)
dd if=/dev/zero of=/swapfile bs=1M count=2048
# 设置文件权限(仅root可读写)
chmod 600 /swapfile
# 格式化为Swap分区
mkswap /swapfile
# 启用Swap
swapon /swapfile
# 持久化配置(重启后仍生效)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
fallocate命令快速创建Swap文件(更高效):sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
验证Swap是否启用:swapon --show。若使用Maven/Gradle等构建工具,除了调整JVM内存,还需优化插件配置:
maven.compiler.fork=true(启用独立JVM编译),避免与主进程共享内存;同时配置maven.compiler.jvmArgs(如-Xmx2g),在pom.xml中添加:<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>
<compilerArgs>
<arg>-J-Xmx2048m</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
gradle.properties中的org.gradle.jvmargs外,可通过--max-workers参数减少并行编译的线程数(降低内存峰值),例如gradle build --max-workers=2。通过top、htop或ps aux --sort=-%mem命令查看系统内存占用,关闭占用较高的非必要进程(如浏览器、大型软件、闲置的服务),释放物理内存供编译使用。
对于大型项目,将代码拆分为多个模块(如Maven的多模块项目),或分批次编译(每次编译部分Java文件),减少单次编译的内存消耗:
# 示例:分两次编译不同包的文件
javac -J-Xmx1g -d target/classes src/com/example/module1/*.java
javac -J-Xmx1g -d target/classes src/com/example/module2/*.java
这种方式可避免一次性加载所有文件导致的内存溢出。
-XX:+UseG1GC(启用G1垃圾收集器,适合大内存应用)或-XX:+UseCompressedOops(压缩对象指针,减少元空间占用),例如:javac -J-Xmx2g -XX:+UseG1GC -XX:MaxMetaspaceSize=512m YourJavaFile.java
System.gc()手动触发垃圾回收(仅用于调试,生产环境不建议频繁使用)。SLF4J替代Log4j),减少编译时的类加载和内存占用。