java应用linux环境下虚拟内存高

qiaosym 2017-02-16

linux 环境下,top -d 2 -H -p pid

查看应用,发现VIRT  RES过高

分析原因:linux使用了glibc, glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.

glibc 在版本 2.10 引入的 arena 新功能导致。CentOS 6/7 的 glibc 大都是 2.12/ 2.17 了,所以都会有这个问题。这个功能对每个线程都分配一个分配一个本地arena来加速多线程的执行。

在 glibc 的 arena.c 中使用的 mmap() 调用就和之前的示例代码类似:
p2 = (char *)mmap(aligned_heap_area, HEAP_MAX_SIZE, PROT_NONE,
                          MAP_NORESERVE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)
之后,只有很小的一部分地址被映射到了物理内存中:
mprotect(p2, size, PROT_READ | PROT_WRITE)
因此在一个多线程程序中,会有相当多的 64MB 的 arena 被分配。

java应用基本都是多线程,而且线程资源的回收也不是那么的及时,所有会有虚拟内存过高的现象

相关推荐