(comments)
原始链接: https://news.ycombinator.com/item?id=44025979
Poireau is a sampling allocation debugger aiming to help identify why a program's memory usage grows over time, particularly useful for flagging long-lived allocations that contribute to memory leaks.
One challenge is efficiently determining during `free()` whether a given pointer was sampled. The Hacker News discussion highlights two approaches: Poireau reportedly segregates sampled pointers into different memory address spaces. Alternatively, Sciagraph profiles allocations by ensuring sampled allocations are a minimum size (e.g., 16KiB), allowing `free()` to identify them using `malloc_usable_size()`. This introduces potential false positives but avoids costly lookups. Alignment is also mentioned as a potential heuristic. The tool is valuable for pinpointing the source of increasing memory consumption, as exemplified by diagnosing memory growth in a Ruby process.
Poireau does this, IIRC, by putting the pointers it sampled in a different memory address.
Sciagraph (https://sciagraph.com), a profiler I created, uses allocation size. If an allocation is chosen for sampling the profiler makes sure its size is at least 16KiB. Then free() will assume that any allocation 16KiB or larger is sampled. This may not be true, it might be false positive, but it means you don't have to do anything beyond malloc_usable_size() if you have free() on lots and lots of small allocations. A previous iteration used alignment as a heuristic, so that's another option.
reply