Node.js使用jemalloc内存分配器显著减少内存使用

这篇具有很好参考价值的文章主要介绍了Node.js使用jemalloc内存分配器显著减少内存使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Node.js 默认使用的是 ptmalloc(glibc) 内存分配器,而:

在服务端领域「不会选择默认的 malloc」是一个常识。( 来源 )

ptmalloc 的分配效率较低( 来源 ),对于 长时间、多核 / 多线程 运行的程序( 来源 ),特别适合使用 jemalloc 分配器,使用 jemalloc 分配内存可以更好的处理 内存碎片 问题( 来源 )。

jemalloc 并不总是最优的( 来源 ),但十分适合服务端 Node.js 程序使用。

正文

Linux
 # install
  sudo apt-get update
  sudo apt-get install -y libjemalloc-dev
  
  # run
  # 启动的时候添加 jemalloc 分配器,`LD_PRELOAD` 的格式是以空格为分割。
  LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so $LD_PRELOAD" node index.js

jemalloc 写入 ld.so.preload 可以让所有写入之后运行的进程默认使用 jemalloc 分配器,一般没必要,除非你有会启动多个进程的场景:

echo "/usr/lib/x86_64-linux-gnu/libjemalloc.so" >> /etc/ld.so.preload

检验对应的 node 进程是否正确使用了 jemalloc

  # 使用 top 等工具找到对应 node 进程的 pid 再查询即可
  sudo cat /proc/<PID OF NODEJS>/smaps | grep jemalloc
macOS
  # install
  brew install jemalloc

  # run
  # 在具体使用时 `${version}` 版本号的部分换成你自己安装的即可
  DYLD_INSERT_LIBRARIES=/usr/local/Cellar/jemalloc/5.3.0/lib/libjemalloc.dylib node index.js
  #                                                ^ ${version}
检验脚本

运行以下脚本可以测试 jemalloc 是否生效,默认情况下会使用多达 4 G 内存,若使用 jemalloc ,则使用内存会大大减少至几十 M 。

注:不要在内存不足 8 G 的服务器上运行,剩余内存不够会直接宕机。

// index.js

const bs = 4 * 1024 * 1024; // 4 MiB
const retained = [];
let i = 0, flag = false;

function tick() {
  i++;
  if (i % 1000 === 0) {
    console.log(`RSS [${i}]: ${process.memoryUsage().rss / 1024 / 1024} MiB`);
  }
  retained.push(Buffer.allocUnsafe(bs));
  if (i === 5000) {
    console.log('Clearing retained and enabling alloc');
    retained.length = 0;
    flag = true;
  }
  if (flag) Buffer.alloc(bs); // Buffer.alloc(bs - 10) seems to be fine here
  if (i < 10000) setImmediate(tick);
}

tick();

例子

个人例子:使用 jemalloc 后,在我的服务端程序上原持续占用 900 M 内存的程序,现会在 200 M900 M 之间波动,可以看到回收效率显著提高,在调用需求下降时(如半夜),内存使用大幅减少:

Node.js使用jemalloc内存分配器显著减少内存使用,node.js,jemalloc,malloc,javascript

经典例子:npmmirror 使用 jemalloc 大幅减少占用内存。( 来源 )

总结

对于 长时间、多进程 的 Node.js 服务端程序,我们可以切换至 jemalloc 内存分配器提高内存回收效率,特别对于易产生内存碎片(如大量 JSON 序列化)的场景,格外有效。

实践中,修订容器脚本,在镜像构建时运行对应的命令即可。文章来源地址https://www.toymoban.com/news/detail-772927.html

到了这里,关于Node.js使用jemalloc内存分配器显著减少内存使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字电路基础(四) 数据分配器、数据选择器和数值比较器

    在数据传输的过程中,数据选择器可以把某一路的数据分配到不同的数据通道上,这种电路称为数据分配器。简称DEMUX,一般有已鞥输入和多个输出。如下图所示是一个四路数据选择器的芯片集成图: 它可以将D送到数据变量选择的通道,下图是数据选择器的真值表: 可以看

    2024年02月05日
    浏览(36)
  • Flink--7、窗口(窗口的概念、分类、API、分配器、窗口函数)、触发器、移除器

                           星光下的赶路人star的个人主页                        内心的平静始于不再让他人掌控你的感情 在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一

    2024年02月08日
    浏览(30)
  • centos下使用jemalloc解决Mysql内存泄漏问题

    参考: MySQL bug:https://bugs.mysql.com/bug.php?id=83047tdsourcetag=s_pcqq_aiomsg  https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md (1)ptmalloc 是glibc的内存分配管理 (2)tcmalloc 是google的内存分配管理模块 (3)jemalloc 是BSD的提供的内存分配管理 (可以 使用jemalloc优化Nginx ) 三者jemalloc和tcmall

    2024年02月11日
    浏览(35)
  • Node.js HTTP 模块的内存泄露问题

    很久没有逛社区了,晚上回来看了一下最近的情况,突然看到一个内存泄露问题,作为一个 APM 开发者,自然想分析其中的原因。 下面介绍一下具体的问题。看一下 demo。 Node.js v20.3.1 下执行上面代码(node --expose-gc demo.js)输出如下。 可以看到内存不断在增长。下面来分析这

    2024年02月12日
    浏览(41)
  • [正式学习java②]——数组的基本使用,java内存图与内存分配

     🌈键盘敲烂,年薪30万🌈 目录 一、数组的两种初始化方式 1.完整格式(静态初始化) 2.动态初始化 二、数组的遍历方式 三、数组的开辟与访问 四、数组的注意事项 1.数组直接打印打印的是地址值 2.数组在内存图中的位置 3.数组一旦开辟了空间长度是不可变的 4.区分数组长度

    2024年02月08日
    浏览(28)
  • 【Android】使用对象池(Object Pool)来缓存已经创建的字节数组,避免频繁地进行内存分配和回收操作提高性能

    在Android中,使用new byte[]创建字节数组是在堆上分配内存,不会直接导致Native内存的增长。但是,如果我们频繁地创建和销毁字节数组,就可能会导致堆内存不足,并触发GC,从而影响应用程序的性能。 在Android中,堆内存的大小是有限制的。如果我们频繁地创建和销毁字节数

    2024年02月09日
    浏览(36)
  • 【C/C++】静态内存分配与动态内存分配

    1.1 - 定义概述 内存分配 (Memory Allocation) 是指为计算机程序或服务分配物理内存空间或虚拟内存空间的一个过程。通常在程序执行前或执行时完成内存分配。 1.2 - 分类概述 存在两种类型的内存分配: 编译时内存分配或静态内存分配 (Compile-time or Static Memory Allocation) 运行时内存

    2024年02月11日
    浏览(33)
  • 【Node.js 安装】Node.js安装与使用教程

    先说结论,Node.js 它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行 JavaScript 诞生于 1995 年,几乎是和互联网同时出现;Node.js 诞生于 2009 年,比 JavaScript 晚了 15 年左右。 在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者

    2024年02月16日
    浏览(40)
  • Node.js详解(三):Node.js的安装及基本使用

    Node.js支持在 Windows 、Linux以及在Mac 上安装使用 安装非常简单,无复杂操作;就不多做赘述,挂个连接参考:https://www.runoob.com/nodejs/nodejs-install-setup.html 安装完成,我们可以使用以下命令来查看当前的 Node 版本: $ node -v v18.16.0 注意:不同版本间可能是有差异的。 1、介绍 nvm全

    2024年02月10日
    浏览(49)
  • C++——内存分配与动态内存管理

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包