毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

VIRT占用内存大如何解决

更新时间:2016-8-7:  来源:毕业论文

服务器运行在虚拟机上,系统为小红帽,发布了四个java通讯程序,四个java程序VIRT 非常大,16G的内存,剩余内存只有83M,虚拟机平台经常内存报警

问答:
1、如果将内存的使用率降下来?
2、VIRT为何占用这么大

发现有很多奇怪的64MB的内存映射,查资料发现这是 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 被分配。这个可以用环境变量 MALLOC_ARENA_MAX 来控制。在64位系统中的默认值为 128。

Java 的特殊性

Java 程序由于自己维护堆的使用,导致调用 glibc 去管理内存的次数较少。更糟的是 Java 8 开始使用 metaspace 原空间取代永久代,而元空间是存放在操作系统本地内存中,那线程一多,每个线程都要使用一点元空间,每个线程都分配一个 arena,每个都64MB,就会导致巨大的虚拟地址被分配。
6. 结束语

总结一下:

    VIRT高是因为分配了太多地址空间导致。
    一般来说不用太在意VIRT太高,因为你有16EB的空间可以使用。
    如果你实在需要控制VIRT的使用,设置环境变量MALLOC_ARENA_MAX,例如hadoop推荐值为4,因为YARN使用VIRT值监控资源使用。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。