CentOS7普通用户运行Jar报VM初始化错误:无法预留足够代码缓存
问题原因
这是因为CentOS 7对普通用户设置了进程内存资源限制,root用户默认不受这类限制。Java虚拟机初始化时需要预留足够的Code Cache(代码缓存)空间,普通用户的内存配额达不到JVM的要求,所以启动失败。
解决方法
临时生效(仅当前会话)
- 切换到目标普通用户,执行命令放开虚拟内存限制:
之后再运行ulimit -v unlimitedjava -jar jarfile.jar即可正常启动。
永久生效(用户每次登录自动生效)
- 编辑该用户的
~/.bashrc配置文件,添加一行:ulimit -v unlimited - 执行以下命令让配置立即生效:
source ~/.bashrc
精细控制内存配额(可选)
如果不想完全放开限制,可以根据JVM实际需求设置具体数值(比如允许使用32GB虚拟内存):
ulimit -v 33554432
同样把这行写入~/.bashrc就能永久生效。
排查cgroup资源限制(若上述方法无效)
如果系统通过cgroup做资源管控,需要调整该用户的cgroup内存配额:
- 先查看当前用户的cgroup内存限制:
cat /sys/fs/cgroup/memory/user/$(id -u)/memory.limit_in_bytes - 切换到root用户,修改限制(示例为放开限制):
也可以设置具体数值,比如允许使用40GB:echo unlimited > /sys/fs/cgroup/memory/user/$(id -u)/memory.limit_in_bytesecho 42949672960 > /sys/fs/cgroup/memory/user/$(id -u)/memory.limit_in_bytes
内容的提问来源于stack exchange,提问作者Edawg O.
相关产品推荐
相关产品推荐

