关于64位操作系统,应用程序占用内存飙升的问题解决方法记录

最近在处理java程序OA的时候,发现服务器占用内存情况非常严重,非常恶劣

最后度娘,谷歌了一上午,终于发现了问题所在,在这里做个记录.

pmap -x  $(pidof webname)

通过这种方式查看到的应用程序内存使用情况如下图所示

关于64位操作系统,应用程序占用内存飙升的问题解决方法记录

可以看出这里有许多的anon进程 原因是:

glibc为了分配内存的性能的问题,使用了很多叫做arena的memory pool,缺省配置在64bit下面是每一个arena为64M,一个进程可以最多有 cores * 8个arena。假设你的机器是4核的,那么最多可以有4 * 8 = 32个arena,也就是使用32 * 64 = 2048M内存。 当然你也可以通过设置环境变量来改变arena的数量.例如export MALLOC_ARENA_MAX=1

hadoop推荐把这个值设置为4。当然了,既然是多核的机器,而arena的引进是为了解决多线程内存分配竞争的问题,那么设置为cpu核的数量 估计也是一个不错的选择。设置这个值以后最好能对你的程序做一下压力测试,用以看看改变arena的数量是否会对程序的性能有影响。

mallopt(M_ARENA_MAX, xxx)如果你打算在程序代码中来设置这个东西,那么可以调用mallopt(M_ARENA_MAX, xxx)来实现,由于我们AuthServer采用了预分配的方式,在各个线程内并没有分配内存,所以不需要这种优化,在初始化的时候采用mallopt(M_ARENA_MAX, 1)将其关掉,设置为0,表示系统按CPU进行自动设置。






你可能感兴趣的:(关于64位操作系统,应用程序占用内存飙升的问题解决方法记录)