- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天阅读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
就是一个例子,他们专注于优化来自多个线程的分配以使其更快,但以使用更多的内存为代价。这些类型的分配器通常是在仔细调查特定案例后才部署的,这些案例表明它将受益于这种权衡。
一些实现对分配器的使用设置了一定的限制,以使其更快。单线程分配器就是一个例子,它将消除对同步对象的需求,以使其更快。
其他实现则尽可能地达到通用目的,不希望任何情况都比其他实现更有利。此类别包括标准库中包含的默认分配器。
关于malloc - 使用jemalloc,malloc,calloc和其他常见替代方法的优缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252149/
我尝试设置我的Redis服务器,当执行make命令时,出现错误:“jemalloc/jemalloc.h:制作Redis时没有这样的文件或目录”,我已经尝试了我能找到的所有步骤,例如make dist
这个问题在这里已经有了答案: Ruby 2.6.5 with jemalloc (3 个答案) 关闭 3 年前。 这个命令应该显示 -ljemalloc 但它不是。我可以在 ruby-2.4.3
我有一个庞大的代码分布在许多文件中。这段代码目前使用的是普通的 malloc。 我想在其中实现 Jemalloc 以获得更好的性能,并且我还想使用 Jemalloc 的内存分析器来了解该代码中每个分配
以下程序不会触发断言失败: int main(int argc, char **argv) { int * n = (int *)malloc(100); //malloc_stats_pri
Firefox 3 附带了一个新的分配器:jemalloc。 我在几个地方听说这个新的分配器更好。不过,Google 的顶级结果并未提供任何进一步的信息,我对它到底是如何工作的很感兴趣。 最佳答案 j
在 Ubuntu 14.04 中使用 Cassandra 3.4。 JDK 8.当 Cassandra 启动时,我在热身中注意到以下警告: jemalloc shared library could
可以jemalloc修改为从共享内存分配? FreeBSD 函数dallocx()意味着您可以提供一个用于分配的指针,但我没有看到一种明显的方法来告诉 jemalloc 限制来自该内存的 all 分配
现在我正在积极研究内存管理器jemalloc和tcmalloc的代码。但我无法理解这两个管理器如何跟踪线程。 如果我理解正确的话,在内存分配期间可以检测到一个新线程,然后创建一个新的线程缓存。但是,t
如何在 Windows 上编译 JeMalloc?我查看了他们的 github,但没有关于如何构建它的说明。 最佳答案 您需要使用 MinGW 构建它 - 可能是 MinGW-w64。使用 MSYS2
如何将 C++ STL 容器与 jemalloc(或任何其他 malloc 实现)一起使用? 是不是像include jemalloc/jemalloc.h那么简单?或者我应该为他们写一个分配器吗?
我想在内存池中使用像 jemalloc/tcmalloc 这样的高性能通用分配器。有这样做的指南吗?我不想使用 jemalloc/tcmalloc 作为 malloc 的替代品。 我有一个使用 lib
我有一个分配大量内存的应用程序,我正在考虑使用比 malloc 更好的内存分配机制。 我的主要选择是:jemalloc 和 tcmalloc。使用其中任何一个有什么好处吗? http://lockle
tcmalloc/jemalloc 是改进的内存分配器,还引入了内存池以实现更好的内存分配。那么它们之间有什么区别以及如何在我的应用程序中选择它们呢? 最佳答案 这取决于您的程序的要求。如果你的程序有
我已经安装了 jemalloc 并遵循了所有指南,但它看起来不像是 ruby 在使用它: $ apt install libjemalloc2 $ ls -la /usr/lib/x86_64-lin
我们正在尝试追踪使用 jemalloc (5.2.0) 的 proxysql (2.0.14) 中的内存泄漏。我们在启用调试符号的情况下编译了 proxysql。烘焙到 proxysql 中的 jem
我试图在构建时将 jemalloc 库链接到我的应用程序中,将其用作通用实现。根据https://github.com/jemalloc/jemalloc/wiki/Getting-Started要使
我曾尝试使用以下方法转储演示程序的内存配置文件:export MALLOC_CONF="prof:true,prof_prefix:jeprof.out" int main() { int
如何将jemalloc(jemalloc-3.4.0)移植到ARM上? 如果我修改 #define CPU_SPINWAIT asm volatile("pause") 到 #define CPU_S
我运行一个使用 jemalloc 作为内存分配器的 C++ 程序,它将大块预先划分为预定义大小的小块(即 1、2、4、8、... 字节) 即使我请求 110 字节的内存分配,它返回的内存容量为 128
我在 ubuntu 12.04.5 LTS 上并尝试使用 jemalloc 安装 ruby。 jemalloc 已成功安装(https://blog.scalingo.com/2017/05/02
我是一名优秀的程序员,十分优秀!