Java VM初始化报错无法分配metaspace,需额外多少内存可正常运行程序
问题根因
你遇到的Could not allocate metaspace: 1073741824 bytes错误核心是ulimit对jenkins用户的虚拟内存限制过低:
从你给出的ulimit -a结果可以看到,virtual memory (-v)参数为4000000KB,换算后约为3.8GB,这个限制会限制单个进程能申请的所有虚拟内存总和,包含Java堆、元空间、栈空间、JVM自身运行开销、JNI调用占用内存等。
而你预设的元空间大小就有1GB,再加上Java进程默认会申请的堆内存,已经超过了3.8GB的限制,所以连java -version命令都无法执行。
所需内存计算
你要正常运行Android构建任务,需要满足所有相关Java进程的内存需求总和:
- Gradle守护进程本身配置的堆内存为5GB(
org.gradle.jvmargs=-Xmx5120M) - 元空间固定需要1GB
- Gradle运行的其他额外开销(栈、JVM内部内存、缓存等)至少预留0.5GB
- Dex编译阶段会单独fork新的Java进程,配置的堆内存为4GB(
javaMaxHeapSize "4g"),这部分也需要额外的内存配额
最低调整建议
- 虚拟内存限制(
-v)从当前3.8GB至少调整到11GB,对应数值为11264000KB - 最大内存大小限制(
-m)从当前8GB至少调整到11GB,对应数值为11264000KB
如果仅需要临时跑通java -version命令,只需要把虚拟内存限制调整到3GB以上即可满足基础运行要求。
额外注意事项
- 临时修改的ulimit配置重启终端/服务后会失效,需要永久生效的话请修改
/etc/security/limits.conf文件中jenkins用户的对应配置 - 如果你通过systemd管理jenkins服务,还需要修改jenkins.service文件中的
LimitAS、LimitMEMLOCK参数,否则limits.conf的配置不会对jenkins进程生效
内容的提问来源于stack exchange,提问作者ericn
相关产品推荐
相关产品推荐

