对于直接使用javac编译或通过构建工具(如Maven、Gradle)编译的情况,可通过调整JVM堆内存参数解决内存不足问题。
-J-Xmx参数设置最大堆内存(如2GB),例如:javac -J-Xmx2g -d target/classes -sourcepath src/main/java -subpackages com.example
pom.xml中配置maven-compiler-plugin,或在MAVEN_OPTS环境变量中设置内存:<!-- 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>
<maxmem>2048m</maxmem>
<compilerArgs>
<arg>-J-Xmx2048m</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
或通过命令行设置:export MAVEN_OPTS="-Xmx2048m"
mvn clean install
gradle.properties中设置JVM内存参数:org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
运行gradle build时会自动应用这些设置。若系统物理内存不足,可通过创建交换文件扩展虚拟内存,缓解编译时的内存压力。
# 创建2GB交换文件(可根据需求调整大小,如4G则count=4194304)
dd if=/dev/zero of=/swapfile bs=1M count=2048
# 设置文件权限(仅root可读写)
chmod 600 /swapfile
# 格式化为交换文件
mkswap /swapfile
# 启用交换文件
swapon /swapfile
# 持久化配置(重启后自动启用)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 使用fallocate快速创建2GB交换文件
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
创建后可通过free -h命令验证交换空间是否启用。top或htop命令查看系统内存占用,关闭占用较高的非必要应用(如浏览器、大型软件),释放内存供编译使用。mvn clean install -pl module1 -am),减少单次编译的内存消耗。sync && echo 3 > /proc/sys/vm/drop_caches
-XX:+UseCompressedOops参数,可突破32GB堆内存限制,提升内存使用效率(默认开启,无需手动设置)。Metaspace溢出(如java.lang.OutOfMemoryError: Metaspace),可增加元空间大小:javac -J-Xmx2g -J-XX:MetaspaceSize=256m -J-XX:MaxMetaspaceSize=512m YourJavaFile.java
或在构建工具中配置对应参数(如Maven的maven.compiler.jvmArgs)。确保系统安装的是64位JVM(通过java -version查看),64位JVM支持更大的堆内存(远超32位JVM的4GB限制),能有效解决大型项目编译时的内存不足问题。