Gradle同步Minecraft模组项目时反编译步骤内存占用过高导致崩溃的解决请求
我完全懂你现在的崩溃——用IntelliJ搞MC模组,Gradle同步到反编译步骤就疯狂吃内存,4G物理内存加4G swap都扛不住,改了JVM参数还像石沉大海一样没效果,确实糟心。结合你的Linux环境、Java 21和Gradle 8.14.3的配置,我给你整理几个针对性的解决方案,从修复参数不生效的问题到手动执行反编译都有:
一、先搞清楚:为什么你改的org.gradle.jvmargs没起作用
你设置了-Xmx512m但Gradle还是吃到2G,核心原因是:Minecraft模组的反编译任务(比如decompileClient)是独立于Gradle主进程的子任务,它有自己的JVM参数,根本不鸟你给Gradle主进程设的内存限制!
所以你要给反编译这个子任务单独配参数,而不是Gradle主进程。
方案1:给反编译任务单独设置JVM内存限制
找到项目根目录的build.gradle(如果用Kotlin DSL就是build.gradle.kts),添加以下配置,专门限制反编译子任务的内存:
如果你用Groovy DSL(build.gradle)
// 给所有带decompile的任务设置JVM参数 tasks.withType(JavaExec) { if (name.contains('decompile')) { // 设1G内存足够完成反编译,根据你的情况可以降到768M jvmArgs = ['-Xmx1G'] } }
如果你用Kotlin DSL(build.gradle.kts)
tasks.withType<JavaExec> { if (name.contains("decompile")) { jvmArgs = listOf("-Xmx1G") } }
这个配置会直接作用于反编译的子进程——它才是那个吃内存的元凶,设1G绝对够完成MC的代码反编译了。
二、优化Gradle主进程的内存(辅助)
虽然主进程的参数不影响反编译,但优化它能避免和子进程抢内存。修改项目根目录的gradle.properties,确保这些配置:
# Gradle主进程的JVM参数,512M完全够用 org.gradle.jvmargs=-Xmx512m -XX:+UseG1GC -XX:MaxMetaspaceSize=256m # 关闭Gradle的冗余特性,减少内存消耗 org.gradle.daemon=true org.gradle.parallel=false org.gradle.configureondemand=true org.gradle.caching=true
注意:
-XX:MaxPermSize在Java 8之后就被移除了,Java 21用的是MaxMetaspaceSize,你之前加这个参数报错是正常的,直接删掉就行。
三、手动执行反编译步骤(彻底掌控)
如果你不想被IDE自动同步牵着走,完全可以手动执行反编译,跳过IDE的自动同步:
步骤1:单独执行反编译任务
打开终端,进入项目根目录,执行:
./gradlew decompileClient
这个命令会单独运行客户端反编译任务,执行过程中你可以实时看内存占用,也可以临时给它加参数:
./gradlew decompileClient -Dorg.gradle.jvmargs="-Xmx1G"
步骤2:让IDE只负责编辑,不自动同步Gradle
- 打开IntelliJ IDEA,进入
File > Settings > Build, Execution, Deployment > Build Tools > Gradle - 把
Build and run using和Run tests using都改成IntelliJ IDEA - 在右侧的
Gradle Projects面板里,右键你的项目,选择Unlink Gradle Project
这样IDE就不会自动触发Gradle同步了,你完全手动控制什么时候执行反编译、构建等任务,从根源上避免IDE触发的不必要内存消耗。
四、Linux环境的额外优化
你的系统有4G swap,可以调整swap的使用策略,避免系统突然OOM:
- 临时生效:执行
sudo sysctl vm.swappiness=10 - 永久生效:编辑
/etc/sysctl.conf,添加vm.swappiness=10,然后执行sudo sysctl -p
默认Linux的swappiness是60,改成10后系统会优先用物理内存,只有物理内存快耗尽时才用swap,这样不会一下子把swap榨干,也能减少频繁换页的卡顿。
五、关于Gradle 9.0不兼容的警告
这个警告暂时不用管——Minecraft的模组工具链(Forge/Fabric)还没更新到兼容Gradle 9.0,你用当前的Gradle 8.14.3是完全没问题的,等模组工具链更新后再考虑升级Gradle就行。
最后再检查一个坑
确保你修改的是项目根目录的gradle.properties,而不是用户目录下的~/.gradle/gradle.properties(虽然用户目录的配置也会生效,但项目根目录的优先级更高)。如果两个地方都有org.gradle.jvmargs,以项目根目录的配置为准。
内容来源于stack exchange

