突然集群的2个节点挂了,通过top查看, 虚拟内存22G,
通过 pmap -x 8 | grep anon
一大堆64M
Linux下glibc的内存管理机制用了一个很奇妙的东西,叫arena。在glibc分配内存的时候,大内存从从中央分配区分配,小内存则在线程创建时,从缓存区分配。为了解决分配内存的性能的问题,就引入了这个叫做arena的memory pool。而恰好,在64bit系统下面,它的缺省配置为64M。一个进程可以最多有cores*8个arena,假如服务器是4核的,那么最多有4*8=32个arena,也就是32*64 = 2048M内存。然而,为了满足业务,我这台服务器居然是12核的,单单一个进程的arena占用的内存就达到了6G。
可以发现,通过服务器上一个参数MALLOC_ARENA_MAX可以控制最大的arena数量
export MALLOC_ARENA_MAX=1 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL MALLOC_ARENA_MAX
重启后java进程, 查看效果。
参考: https://blog.csdn.net/u010686469/article/details/77319599