本帖最后由 linux_love 于 2014-9-19 11:46 编辑
多谢各位英雄支持,这个问题困扰我N久了,昨天终于让我给拿下了,在Linux下有个CommitLimit 用于限制系统应用使用的内存资源,
#grep -i commit /proc/meminfo
CommitLimit: 20389524 kB
Committed_AS: 18541832 kB
其中:
CommitLimit是一个内存分配上限,
Committed_AS是已经分配的内存大小。
当系统中java程序提交的内存+Committed_AS大于CommitLimit,那么java就会报上面的错误。
CommitLimit是有内核参数overcommit_ratio的控制的,
虚拟内存算法:CommitLimit = 物理内存 * overcommit_ratio(默认50,即50%) + swap大小
而我系统中配置的是10,更悲催的是overcommit_memory的值配置的是2,
overcommit_memory参数就是控制分配内存是否可以超过CommitLimit,默认是0,即启发式的overcommitting handle,会尽量减少swap的使用,root可以分配比一般用户略多的内存。1表示允许超过CommitLimit,2表示不允许超过CommitLimit。
所以当我把overcommit_ratio的值调为60的时候,内存基本上就够用了,这个问题就从根本上解决了!
当然我还是将overcommit_memory调为0了,为了避免再次出现这个问题!
参考:http://bkeep.blog.163.com/blog/static/12341429020123795827876/