擅长:python、mysql、java
<p>您可能只需点击linux内存分配器的默认行为。在</p>
<p>基本上Linux有两种分配策略,sbrk()用于小内存块,mmap()用于较大的内存块。sbrk()分配的内存块不容易返回到系统,而基于mmap()的内存块则可以(只需取消页面映射)。在</p>
<p>因此,如果分配的内存块大于libc中malloc()分配器决定在sbrk()和mmap()之间切换的值,就会看到这种效果。请参见mallopt()调用,尤其是MMAP_阈值(<a href="http://man7.org/linux/man-pages/man3/mallopt.3.html" rel="nofollow">http://man7.org/linux/man-pages/man3/mallopt.3.html</a>)。在</p>
<p><strong>更新</strong>
回答您的额外问题:是的,如果内存分配器的工作方式与Linux上的libc分配器类似,那么您可能会以这种方式泄漏内存。如果改用Windows LowFragmentationHeap,它可能不会泄漏,这在AIX上类似,这取决于配置了哪个malloc。也许其他分配器(tcmalloc等)也可以解决这些问题。sbrk()速度非常快,但存在内存碎片问题。CPython对此无能为力,因为它没有压缩垃圾收集器,而是简单的引用计数。在</p>
<p>Python提供了一些减少缓冲区分配的方法,例如请参阅以下博客文章:<a href="http://eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-protocol-and-memoryviews/" rel="nofollow">http://eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-protocol-and-memoryviews/</a></p>