求助,linux 程序内存统计

狼异族 2023-12-21 10:52:44

我在子线程申请分配 10M 内存,但是在进行内存统计的时候发现, vmSize 增加 64M,这个不是我想要的,我只想统计我申请的10M的内存,请问这个有没有什么方法?

...全文
363 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lennon1994 2023-12-22
  • 打赏
  • 举报
回复

在 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。

如果你想要更精确地控制内存的使用,你可以尝试以下方法:

  1. 使用mmap:你可以直接使用mmap来分配内存,这样你可以更精确地控制分配的内存大小。但是这样做可能会使你的代码变得更复杂。
  1. 调整glibc的行为:你可以通过设置环境变量MALLOC_ARENA_MAX来限制glibc创建的内存池的数量1。这可以帮助你减少因内存池导致的额外内存使用。
  1. 使用自定义的内存管理器:你也可以考虑使用一个自定义的内存管理器,如jemalloc或tcmalloc,这些内存管理器可能会提供更多的控制选项。

请注意,这些方法可能会影响你的程序的性能和行为,所以在使用它们之前,你应该充分理解它们的工作原理和潜在的影响213。希望这个信息对你有所帮助!

北方小镇805 2023-12-21
  • 打赏
  • 举报
回复

使用malloc_usable_size

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧