Node.js 中的 内存控制

简介: Node.js 中的 内存控制

内存控制

V8 的垃圾回收机制与内存限制

  • V8 的内存限制

    • 只能使用部分内存,导致 Node 无法直接操作大内存对象
    • 在 V8 中,所有的 JS 对象都是通过堆来进行分配的
    • 限制堆大小原因是 V8 的垃圾回收机制,垃圾回收中引起 JS 线程暂停执行的时间,应用的性能和响应能力会直线下降
  • V8 的垃圾回收机制

高效使用内存

  • 作用域

    • 全局变量需要进程退出才能释放,可以通过 delete 来删除引用关系,或重新赋值让旧的对象脱离引用关系
    • 在 V8 中通过 delete 删除对象的数学有可能导致干扰 V8 的优化,所以通过赋值解除引用更好
  • 闭包

    • 一旦有变量引用中间函数,这个中间函数将不会被释放,同时也会使原始的作用域不会得到释放,作用域中产生的内存占用也不会得到释放

内存指标

  • 查看内存使用情况

    • 查看进程内存占用 process.memoryUsage()
    • 查看系统内存占用
    os.totalmem()
    os.freemem()
  • 堆外内存

    • 堆外内存可以突破内存限制的问题
  • Node 的内存构成主要由通过 V8 进行分配的部分和 Node 自行分配的部分

    • 受 V8 的垃圾回收限制的主要是 V8 的堆内存

内存泄露

  • 造成内存泄露的原因

    • 缓存
    • 队列消费不及时
    • 作用域未释放
  • 慎将内存当做缓存

    • 需要限定缓存对象的大小,加上完善的过期策略以防止内存无限制增长
    • 尽量使用进程外的缓存,减少常驻内存的对象的数量,让垃圾回收更高效,进程之间可以共享缓存(Redis,Memcached)
  • 关注队列状态

    • 消费速度低于生产速度,将会形成堆积,需加强预警监控

内存泄漏排查

  • v8-profiler 对 V8 堆内存抓取快照和对 CPU 进行分析
  • node-heapdump 对 V8 堆内存抓取快照,用于事后分析
  • node-memwatch

大内存应用

Node 提供 stream 模块用于处理大文件
var reader = fs.createReadStream('in.txt');
var writer = fs.createWriteStream('out.txt');

reader.on('data', function (chunk) {
  writer.write(chunk);
});
reader.on('end', function () {
  writer.end();
});

// 简写
var reader1 = fs.createReadStream('in.txt');
var writer1 = fs.createWriteStream('out.txt');
reader1.pipe(writer1);
相关文章
|
1月前
|
XML IDE 前端开发
IDEA忽略node_modules减少内存消耗,提升索引速度
在后端开发中,IDEA 在运行前端代码时,频繁扫描 `node_modules` 文件夹会导致高内存消耗和慢索引速度,甚至可能会导致软件卡死。为了改善这一问题,可以按照以下步骤将 `node_modules` 文件夹设为忽略:通过状态菜单右键排除该文件夹、在设置选项中将其加入忽略列表,并且手动修改项目的 `.iml` 文件以添加排除配置。这些操作可以有效提高IDE的运行性能、减少内存占用并简化项目结构,但需要注意的是,排除后将无法对该文件夹进行索引,操作文件时需谨慎。
56 4
IDEA忽略node_modules减少内存消耗,提升索引速度
|
9天前
|
缓存 监控 JavaScript
|
9天前
|
存储 缓存 JavaScript
|
3天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
4天前
|
JavaScript 前端开发 算法
深入理解JavaScript的内存管理机制
【10月更文挑战第13天】深入理解JavaScript的内存管理机制
14 0
|
2月前
|
Web App开发 存储 监控
Node.js中的内存泄漏
【8月更文挑战第31天】Node.js中的内存泄漏
58 1
|
2月前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
34 3
|
2月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
31 3
|
2月前
|
JavaScript 前端开发 Java
JavaScript内存泄露大揭秘!你的应用为何频频“爆内存”?点击解锁救星秘籍!
【8月更文挑战第23天】在Web前端开发中,JavaScript是构建动态网页的关键技术。然而,随着应用复杂度增加,内存管理变得至关重要。本文探讨了JavaScript中常见的内存泄露原因,包括意外的全局变量、不当使用的闭包、未清除的定时器、未清理的DOM元素引用及第三方库引发的内存泄露。通过了解这些问题并采取相应措施,开发者可以有效避免内存泄露,提高应用性能。
44 1
|
2月前
|
前端开发 JavaScript Java
揭开 JavaScript 垃圾回收的秘密——一场与内存泄漏的生死较量,让你的代码从此焕然一新!
【8月更文挑战第23天】本文通过多个实例深入探讨了JavaScript中的垃圾回收机制及其对应用性能的影响。首先介绍了基本的内存管理方式,随后分析了变量不再使用时的回收过程。接着,通过事件监听器未被移除及全局变量管理不当等场景展示了常见的内存泄漏问题。最后,文章介绍了使用`WeakRef`和`FinalizationRegistry`等现代API来有效避免内存泄漏的方法。理解并运用这些技术能显著提升Web应用的稳定性和效率。
82 0