2012-09-24 60 views
1

该程序写在C++X86_64 Linux 2.6.32.12,有两种情况,一种情况会为每个注入的文件生成一个文件,并发送出去通过UDP(Version A);另一种情况不会生成文件,直接通过UDP(Version B)发送注入的文件。为什么物理内存不断增加并且虚拟内存大小会在linux上长时间增加一点点

=============== VersionA统计图形=========================== http://i.stack.imgur.com/8bxI5.png http://i.stack.imgur.com/8bxI5.png

================ VersionB Statictic图形======================== === http://i.stack.imgur.com/wEnKc.png http://i.stack.imgur.com/wEnKc.png

我使用valgrind验证这两种情况下,该报告是一样的,看不到任何内存泄漏。 这是由linux内核内存映射引起的吗?测试机器有64G内存。 这是memory leak

更新信息:

Version A,我们使用UNIX socket到原来的文件内容发送到另一个应用程序,然后接收处理结果生成所需的文件。如图所示,物理内存将增加。我已经尝试了另一种情况,不要通过Unix套接字发送文件,使用system函数,调用另一个应用程序生成所需的文件,这表明内存不会增加。看来新生成的文件不是问题,它是由Unix套接字引起的。我们使用套接字池,我使用lsof,没有额外的套接字打开。 Unix socket会占用内存吗?

回答

2

我猜测版本A正在为文件内容分配内存,而内存管理器在释放内存时并未返回系统(因为它正确地知道内存将被重用)。

我不用担心,如果内存有压力,内核将重新使用内存。

+0

在版本A中,我们使用UNIX套接字将原始文件内容发送到另一个应用程序,然后接收处理结果生成所需的文件。如图所示,物理内存将增加。我已经尝试了另一种情况,不要通过Unix套接字发送文件,使用系统函数,调用另一个应用程序生成所需的文件,这表明内存不会增加。看来新生成的文件不是问题,它是由Unix套接字引起的。我们使用套接字池,并使用lsof,没有额外的套接字打开。 Unix套接字是否会占用内存? – robin

0

可能您正在获取内存碎片,这会停止将内存块返回到操作系统。

+0

首先,我也认为这是内存碎片的原因,我也使用tcmalloc和jemalloc,结果是一样的,我不知道tcmalloc或jemalloc好,他们似乎将内存分成小块,大块。 – robin

相关问题