這是解決編譯時內存不足的最直接方法。通過-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
),減少編譯時的類加載和內存占用。