虽然是技术开发人员,但是很少些写技术博客,几乎没有,很惭愧。

       以前都是记录在印象笔记和有道笔记中,仅自己可见,所以可能没有梳理的那么清晰。2020年的第一篇笔记(博客),就从最近遇到的linux内存分配问题说起吧。

问题是这样的,公司测试环境服务器物理机上搭载了很多服务,经常有Tomcat服务被杀掉,然后无法启动。后来发现连Java -version都会报错,如图:

Cannot allocate memory??what the fuck。查看内存,free还是有足够的内存。为什么无法分配?

linux 启动es 内存不足 linux 启动 内存分配_linux内存

 

 

        网上查找了一下,并没有解决,可能都不适合我的场景,网上的答案大部分是调启动内存之类的。最后咨询了下运维同事,运维同事给我发了一个shell命令,让我查看:

cat  /proc/sys/vm/overcommit_memory

  查看得到结果是2,运维同时再让我执行:

cat  /proc/sys/vm/overcommit_ratio

  查看得到结果是50,当时并不了解这2个参数的意义。运维同事让我修改vm.overcommit_memory参数,改成1或0。我修改完之后,启动服务正常!

想请教下运维同事这2个参数的含义,他让我直接网上搜索,发现这是linux内存分配的参数,我这里也总结梳理一下这个知识点:

      (1)vm.overcommit_memory 
      默认值为:0

      从查找的文档里得知,该参数有三个值,分别是:
      0:当用户空间请求更多的的内存时,内核尝试估算出剩余可用的内存。
      1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算
      2:当设这个参数值为2时,内核会使用一个决不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。
      (2)vm.overcommit_ratio
      默认值为:50
      这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。

       OK,修改参数方式,执行如下命令,修改vm.overcommit_memory参数:

vi /ect/sysctl.conf

  让这个配置参数生效:

sysctl -p