Linux环境下Android Studio Arctic Fox 2启动失败报Metaspace内存溢出
Fedora 32 Intel环境下Android Studio Arctic Fox Canary 2 Metaspace溢出排障
故障根因
全新安装后启动报java.lang.OutOfMemoryError: Metaspace、AWT事件队列线程连续触发同类溢出最终进程被系统终止,本质是两个问题叠加:
- 多数用户调整
studio.vmoptions时改错了配置文件路径,设置的堆内存、垃圾回收策略参数完全没有被JVM加载,自然没有效果 - 该Canary版本内置的11.0.8 amd64 JRE和Fedora 32的动态库加载逻辑存在兼容缺陷,会出现类加载元数据无法正常回收的泄漏问题,这类Metaspace层面的问题靠调整堆内存配置根本无法解决。
排障步骤
1. 确认vmoptions的实际生效路径
Android Studio的JVM配置加载优先级为:
- 启动时通过
-Didea.vmoptions参数显式指定的配置文件 - 用户家目录下的专属配置路径:
~/.config/google-android-studio/studio64.vmoptions - 安装目录下的默认配置:
<安装根目录>/bin/studio.vmoptions
只要家目录下的专属配置文件存在,安装目录下的任何配置修改都会被直接覆盖,这也是之前调整参数完全没反应的核心原因。
校验方式:从终端执行启动脚本时追加-Dstudio.vmoptions.required=true参数,启动脚本会在初始化阶段直接打印实际加载的配置文件路径、以及所有传入JVM的启动参数,确认设置的Metaspace相关配置是否真的被读取。
2. 配置适配JDK11的Metaspace管控参数
在实际生效的vmoptions文件中,写入以下兼容JDK11的参数,不要硬加和运行时不匹配的回收策略:
-Xms1024m -Xmx4096m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m -XX:+ClassUnloading -XX:+UseG1GC
- 不要手动指定
-XX:+UseConcMarkSweepGC这类JDK11下已被逐步弃用的回收器参数,否则会触发类加载流程异常,导致Metaspace空间快速耗尽。
3. 规避内置JRE的兼容缺陷
如果按上述配置调整后依然复现Metaspace溢出,说明内置的11.0.8 JRE已经出现了类加载泄漏,此时不需要强行适配系统库去兼容内置JRE,直接切换到系统源安装的OpenJDK11运行时即可:
# 安装系统运行时依赖 sudo dnf install java-11-openjdk java-11-openjdk-devel
在vmoptions配置末尾追加两行参数,强制程序使用系统JDK:
-Dstudio.jbr.path=/usr/lib/jvm/java-11-openjdk -Dstudio.jbr.required=false
这会跳过程序对内置JRE的强制校验,避免程序自动回退到存在兼容问题的内置运行时。
4. 解决AWT线程的二次溢出
日志中AWT-EventQueue-1线程连续抛出Metaspace溢出,是因为首次弹出错误提示框时,程序已经耗尽了全部Metaspace空间,没有多余内存加载Swing错误弹窗的相关类:
- 首次启动时追加临时参数
-Ddisable.android.first.run=true,跳过启动初始向导里的NDK自动检测、实时布局预览、云服务集成等预加载流程,减少启动阶段的类加载数量 - 等程序正常进入主界面后,再在插件设置里按需开启需要的功能,不要默认启用所有预装插件。
内容的提问来源于stack exchange,提问作者Mehdi Haghgoo
相关产品推荐
相关产品推荐

