jps 启动不了,提示 Java heap space,c 中调用 malloc 无法分配 5G 以上的内存。
原来是系统参数 overcommit_memory 和 overcommit_ratio 搞的鬼。
grep -i commit /proc/meminfo
看到 CommitLimit 和 Committed_As 参数。
CommitLimit 是一个内存分配上限,CommitLimit = 物理内存 * overcommit_ratio (默认 50,即 50%) + swap 大小
Committed_As 是已经分配的内存大小。
overcommit_memory 参数就是控制分配内存是否可以超过 CommitLimit,默认是 0, 即启发式的 overcommitting handle, 会尽量减少 swap 的使用,root 可以分配比一般用户略多的内存。1 表示允许超过 CommitLimit,2 表示不允许超过 CommitLimit。
原来这种怀疑系统参数有问题的诊断一般就是比较和正常机器的 sysctl.conf 配置