Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么物理内存不断增加,而虚拟内存大小在linux上运行很长时间后会略有增加_C++_Linux_Memory Leaks_Virtual Memory - Fatal编程技术网

C++ 为什么物理内存不断增加,而虚拟内存大小在linux上运行很长时间后会略有增加

C++ 为什么物理内存不断增加,而虚拟内存大小在linux上运行很长时间后会略有增加,c++,linux,memory-leaks,virtual-memory,C++,Linux,Memory Leaks,Virtual Memory,该程序是在X86_64 Linux 2.6.32.12上用C++编写的,共有两个案例,一个案例将为每个注入的文件生成一个文件,并通过UDP(版本A)发送出去;另一种情况是不会生成文件,直接通过UDP(版本B)发送注入的文件 =====================版本A统计图形=========================== =====================版本B静态图形=========================== 我已经使用valgrind验证了这两种情况,报告

该程序是在
X86_64 Linux 2.6.32.12
上用
C++
编写的,共有两个案例,一个案例将为每个注入的文件生成一个文件,并通过
UDP(版本A)
发送出去;另一种情况是不会生成文件,直接通过
UDP(版本B)
发送注入的文件

=====================版本A统计图形===========================

=====================版本B静态图形===========================

我已经使用
valgrind
验证了这两种情况,报告是相同的,没有看到任何内存泄漏。 这是由linux内核内存映射引起的吗?试验机具有
64G
内存。 这是内存泄漏吗

更新信息:


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

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


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

可能是内存碎片阻止了内存块返回到操作系统。

在版本A中,我们使用UNIX套接字将原始文件内容发送到另一个应用程序,然后接收处理结果并生成所需文件。如图所示,物理内存将增加。我尝试过另一种情况,不通过Unix套接字发送文件,使用系统函数,调用另一个应用程序生成所需的文件,这表明内存不会增加。似乎新生成的文件不是问题所在,它是由Unix套接字引起的。我们使用套接字池,我使用lsof,没有打开额外的套接字。Unix socket会占用内存吗?首先我也认为是内存碎片的原因,我也使用了tcmalloc和jemalloc,结果是一样的,我不太了解tcmalloc或jemalloc,似乎他们会把内存分为小块、大块。