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);
相关文章
|
14天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
14天前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
27天前
|
存储 JavaScript 前端开发
JS 中的内存管理
【10月更文挑战第17天】了解和掌握 JavaScript 中的内存管理是非常重要的。通过合理的内存分配、及时的垃圾回收以及避免内存泄漏等措施,可以确保代码的高效运行和稳定性。同时,不断关注内存管理的最新发展动态,以便更好地应对各种挑战。在实际开发中要时刻关注内存使用情况,以提升应用的性能和质量。
26 1
|
19天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
34 6
|
19天前
|
JavaScript 前端开发 Java
JavaScript 中内存泄漏的几种常见情况
【10月更文挑战第25天】实际上还有许多其他的情况可能导致内存泄漏。为了避免内存泄漏,我们需要在开发过程中注意及时清理不再需要的资源,合理使用内存,并且定期检查内存使用情况,以确保程序的性能和稳定性
28 2
|
22天前
|
存储 JavaScript 前端开发
js 中有哪几种内存泄露的情况
JavaScript 中常见的内存泄漏情况包括:1) 全局变量未被释放;2) 意外的全局变量引用;3) 被遗忘的计时器或回调函数;4) 事件监听器未被移除;5) 子元素存在时删除父元素;6) 循环引用。
|
2月前
|
XML IDE 前端开发
IDEA忽略node_modules减少内存消耗,提升索引速度
在后端开发中,IDEA 在运行前端代码时,频繁扫描 `node_modules` 文件夹会导致高内存消耗和慢索引速度,甚至可能会导致软件卡死。为了改善这一问题,可以按照以下步骤将 `node_modules` 文件夹设为忽略:通过状态菜单右键排除该文件夹、在设置选项中将其加入忽略列表,并且手动修改项目的 `.iml` 文件以添加排除配置。这些操作可以有效提高IDE的运行性能、减少内存占用并简化项目结构,但需要注意的是,排除后将无法对该文件夹进行索引,操作文件时需谨慎。
101 4
IDEA忽略node_modules减少内存消耗,提升索引速度
|
1月前
|
缓存 监控 JavaScript
|
1月前
|
存储 缓存 JavaScript
|
30天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。