23,124
社区成员
发帖
与我相关
我的任务
分享
我在子线程申请分配 10M 内存,但是在进行内存统计的时候发现, vmSize 增加 64M,这个不是我想要的,我只想统计我申请的10M的内存,请问这个有没有什么方法?
在 Linux 系统中,内存的分配和统计是一个复杂的过程,尤其是当涉及到虚拟内存(vmSize)时。您提到的情况,即在子线程中申请 10MB 内存,但 vmSize 增加了 64MB,可能由以下几个原因导致:
1. 内存分页: Linux 采用分页管理内存。当您申请一定量的内存时,操作系统可能会分配更多的内存页来满足请求。页的大小通常是固定的(例如 4KB),因此实际分配的内存可能会比请求的多。
2. 内存对齐: 为了提高性能,内存分配通常需要对齐。这可能导致实际分配的内存大于请求的内存。
3. 堆管理开销: 分配器可能会为管理堆内存而保留额外空间。
4. 虚拟内存和物理内存: vmSize 表示的是虚拟内存的大小,它包括所有已分配的内存、映射的文件以及延迟分配的内存。这并不完全反映实际使用或分配的物理内存大小。
为了更准确地统计您的程序实际使用的内存,可以考虑以下方法:
• 使用 mallinfo() 或 malloc_stats(): 这些函数可以提供关于动态分配内存的信息,但它们可能不会包括所有类型的内存使用情况。
• 进程内存使用情况: 您可以查看 /proc/[pid]/status 或 /proc/[pid]/smaps 中的 VmRSS 字段,它表示进程的实际物理内存使用量,更接近您实际使用的内存大小。
• 自定义内存分配器: 实现或使用一个自定义内存分配器,以更精确地控制和监控内存的分配和释放。
• 使用专业的性能分析工具: 如 Valgrind、gperftools 等,这些工具可以提供更详细的内存使用分析。
每种方法都有其优势和限制,可能需要根据您的具体需求来选择最合适的方法
这个问题可能是由于glibc的内存管理机制导致的。在Linux中,当你在一个线程中分配内存时,glibc可能会为这个线程分配一个内存池。这个内存池的大小通常会大于你实际请求的内存大小,这就可能导致你观察到的vmSize的增加1。
如果你想要更精确地控制内存的使用,你可以尝试以下方法:
请注意,这些方法可能会影响你的程序的性能和行为,所以在使用它们之前,你应该充分理解它们的工作原理和潜在的影响213。希望这个信息对你有所帮助!
使用malloc_usable_size