今天我在阅读Rust subreddit时看到了这样的评论:
jemalloc是针对(多线程)速度进行优化,而不是内存使用率。
经过更多的研究,我发现还有更多的替代品(例如calloc)。
我想了解不同内存分配器的优缺点是什么?
如果这个问题看起来很愚蠢,那是因为我的背景主要是解释性语言(这些语言不会暴露出这样细粒度的内存控制)。
今天我在阅读Rust subreddit时看到了这样的评论:
jemalloc是针对(多线程)速度进行优化,而不是内存使用率。
经过更多的研究,我发现还有更多的替代品(例如calloc)。
我想了解不同内存分配器的优缺点是什么?
如果这个问题看起来很愚蠢,那是因为我的背景主要是解释性语言(这些语言不会暴露出这样细粒度的内存控制)。
malloc
、calloc
和realloc
这些函数并不是不同的分配器。它们是从同一个分配器请求内存的不同方式。
malloc
提供未初始化的内存(填充为先前用户存储在其中的任何内容)。
calloc
与malloc
相同,但它还会初始化内存(用零字节0x00
填充)。
realloc
获取已经分配的内存,并允许用户调整其大小。
因此,在分配器及其不同实现的上下文中,malloc
、calloc
和realloc
并不独立列出,因为每个分配器实现都需要自己的这些函数版本。
jemalloc
、ptmalloc
、……当有人想要实现一个不同的分配器时,他不能(可以但默认情况下不应该)将其命名为malloc
,因为它会与C标准库中的函数发生冲突。相反,他们通常会给它一个不同的前缀,比如jemalloc, ptmalloc, nedmalloc, tcmalloc和others。
值得一提的是,C标准库本身也有多个实现,每个实现都会以不同的方式实现其分配器。因此,malloc
的实现会根据编译代码时使用的标准库而异。例如:GNU C标准库、MSVC标准库等。
jemalloc
来占用更多的内存。我测试了我的Ruby应用程序,使用jemalloc
比标准的malloc
更快,并且使用的内存更少。 - akostadinov