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);
相关文章
|
20天前
|
Web App开发 存储 监控
Node.js中的内存泄漏
【8月更文挑战第31天】Node.js中的内存泄漏
36 1
|
28天前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
30 3
|
28天前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
22 3
|
28天前
|
JavaScript 前端开发 Java
JavaScript内存泄露大揭秘!你的应用为何频频“爆内存”?点击解锁救星秘籍!
【8月更文挑战第23天】在Web前端开发中,JavaScript是构建动态网页的关键技术。然而,随着应用复杂度增加,内存管理变得至关重要。本文探讨了JavaScript中常见的内存泄露原因,包括意外的全局变量、不当使用的闭包、未清除的定时器、未清理的DOM元素引用及第三方库引发的内存泄露。通过了解这些问题并采取相应措施,开发者可以有效避免内存泄露,提高应用性能。
28 1
|
28天前
|
前端开发 JavaScript Java
揭开 JavaScript 垃圾回收的秘密——一场与内存泄漏的生死较量,让你的代码从此焕然一新!
【8月更文挑战第23天】本文通过多个实例深入探讨了JavaScript中的垃圾回收机制及其对应用性能的影响。首先介绍了基本的内存管理方式,随后分析了变量不再使用时的回收过程。接着,通过事件监听器未被移除及全局变量管理不当等场景展示了常见的内存泄漏问题。最后,文章介绍了使用`WeakRef`和`FinalizationRegistry`等现代API来有效避免内存泄漏的方法。理解并运用这些技术能显著提升Web应用的稳定性和效率。
72 0
|
1月前
|
JavaScript 前端开发 Java
|
1月前
|
存储 JavaScript 算法
|
1月前
|
搜索推荐 Java API
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
38 0
|
2月前
|
移动开发 运维 JavaScript
阿里云云效操作报错合集之遇到Node.js的内存溢出问题,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
2月前
|
测试技术 API Android开发
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应

热门文章

最新文章