Ubuntu20.04+OpenJDK11环境启动Android Studio报SIGSEGV错误
问题成因分析
从崩溃日志可以定位到错误发生在JVM的Metaspace内存分配逻辑中,具体成因如下:
- 你使用的OpenJDK 11.0.10存在已知的Metaspace并发分配bug,在多线程加载类、内存压力较大的场景下,Metaspace空闲块链表的管理逻辑会出现竞态条件,触发段错误(SIGSEGV)。
- 你的设备只有3G运行内存,Android Studio默认的堆内存配置加上系统本身的内存占用,会导致JVM内存压力偏高,大幅提升了上述bug的触发概率,所以不仅启动AS会崩溃,编译Java代码时也会偶现相同错误。
可行解决方案
- 升级JDK版本
将系统全局OpenJDK和Android Studio使用的JRE都升级到11.0.16+或者17 LTS版本,上述Metaspace分配bug在11.0.12之后的JDK版本中已经被修复。系统JDK可通过apt命令直接安装openjdk-17-jdk,再用update-alternatives命令配置全局默认Java版本即可。 - 调整Android Studio VM参数
打开Android Studio安装目录下的bin/studio64.vmoptions文件,修改配置降低内存压力,参考配置如下:
降低最大堆内存到1024M,增加Metaspace最大限制,避免频繁触发Metaspace扩容分配。-Xms256m -Xmx1024m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=50 - 优化系统内存环境
关闭Ubuntu多余的后台进程、桌面特效,释放可用内存。如果系统没有配置swap或者swap空间小于2G,可新增2G swap交换空间,避免内存不足时触发JVM异常。 - 配置Gradle使用高版本JDK
打开Android Studio的设置页,进入Build, Execution, Deployment -> Build Tools -> Gradle,将Gradle JDK选择为你升级后的11.0.16+或17版本,避免编译时仍然使用旧版本JDK触发bug。
内容的提问来源于stack exchange,提问作者Tiany
相关产品推荐
相关产品推荐

