在正常情况下工作的 malloc 调用发生了巨大的分配(数十 GB)。该系统确实具有巨大的 RAM,并且是运行 2.6 x86_64 内核的 64 位机器。
mem rlimit 已使用 setrlimit 作为 INFINITY 完成。
我想用 Valgrind 运行它来进行内存分析并检查泄漏。
但是当使用 valgrind 运行时,malloc 失败并返回 NULL 指针。
我尝试减少分配的大小,但这无济于事。
任何输入?
问候,-J
在正常情况下工作的 malloc 调用发生了巨大的分配(数十 GB)。该系统确实具有巨大的 RAM,并且是运行 2.6 x86_64 内核的 64 位机器。
mem rlimit 已使用 setrlimit 作为 INFINITY 完成。
我想用 Valgrind 运行它来进行内存分析并检查泄漏。
但是当使用 valgrind 运行时,malloc 失败并返回 NULL 指针。
我尝试减少分配的大小,但这无济于事。
任何输入?
问候,-J
请注意,这malloc(3)
是在骗你——它实际上并没有一次分配所有内存,它只是向操作系统询问它,而操作系统对malloc(3)
. 这是完全正常的行为,大部分时间都可以正常工作。/proc/sys/vm/overcommit_memory
in的描述proc(5)
包含详细信息:
/proc/sys/vm/overcommit_memory
This file contains the kernel virtual memory
accounting mode. Values are:
0: heuristic overcommit (this is the default)
1: always overcommit, never check
2: always check, never overcommit
In mode 0, calls of mmap(2) with MAP_NORESERVE are not
checked, and the default check is very weak, leading
to the risk of getting a process "OOM-killed". Under
Linux 2.4 any nonzero value implies mode 1. In mode 2
(available since Linux 2.6), the total virtual address
space on the system is limited to (SS + RAM*(r/100)),
where SS is the size of the swap space, and RAM is the
size of the physical memory, and r is the contents of
the file /proc/sys/vm/overcommit_ratio.
Valgrind 不能这么轻率。它实际上跟踪进程的已分配、已初始化和未初始化的内存。因此,它需要比进程本身更多的内存,并且它对过度使用内存没有相同的容忍度。
我不知道在 valgrind 下运行程序需要多少内存,但请尝试添加更多 GB 的交换空间。您可以通过将零写入文件来创建新的交换文件dd
——不要使用稀疏文件——然后mkswap(8)
在文件上运行以初始化它并swapon(8)
使用文件名运行以告诉系统将其用作交换文件.