node.js内存泄露问题记录

有意思的 Node.js 内存泄漏问题 作者:elvinpeng,腾讯 WXG 前端开发工程师Node.js 使用的是 V8 引擎,会自动进行垃圾回收(Garbage Collection,GC),因而写代码的时候不需要像 C... 阅读详情




先说一下,事情的来龙去脉。


公司开发一款游戏棋牌游戏,服务端的开发是IO密集型,开发的时候,考虑过使用python,java,node.js。
最终选择了node.js(node.js宣传的杀手功能,异步IO,node.js另外一个分支叫io.js),事情也就由此而起。


因为第一次做手机游戏,对移动网络的估计不足,选择了json作为通信传输数据格式,上线后玩家就频繁掉线(通信数据量太大,移动网络hold不住),
于是想了一个解决方案,把json数据用zip压缩一下,事情好像就万事大吉了(虽然也有不少玩家反应掉线问题,但事情状况已经好很多了)。
开始的时候呢,我们的玩家并不多,cpu的使用率并不高,系统一切正常,后来玩家越来越多,就出现了一个问题服务端开发长出现的问题内存泄露,
每过几天后,玩家的内存就涨上去了。内存泄露对于我们的系统来说,也说不上太严重,每过几天重启一次就可以了。




step1.开始分析我们的代码,看那些代码可能导致内存泄露,因为内存泄露发生在我们的网关进程中,代码量是比较少的,
研究了好些时间,期间也怀疑了好多事情,但写的测试代码都无法证实。问题就这么拖下去了,写一个定时器脚本,在某个时刻重启网关进程。


step2.事情就这么放下,每过一段时间,想起这个问题,又纠结一番。开始做第二个项目了(第二个项目使用mqtt,
以及参照protobuf自己写的一套编解码代码,解决了json数据太大的问题),项目并不成功,用户目前用户不多,系统没有发生内存泄露的问题。


step3. 同事突然想起,会不会是因为zip压缩json数据占用了cpu,我们设想的业务是IO密集型,现在看来就是CPU密集型了,cpu密集,然后node.j的GC工作出现了问题?。



Python中的内存泄漏及其分析方法 缓存对象未正确管理:在某些情况下,为了提高性能,程序会使用缓存来存储一些对象。对象引用未释放:当一个对象不再被使用时,如果其引用计数没有归零,垃圾回收机制无法回收该对象所占用的内存。对象引用未释放:当一个对象不再被使用时,如果其引用计数没有归零,垃圾回收机制无法回收该对象所占用的内存。内存泄漏是一个常见的编程问题,它指的是程序在使用完内存后未正确释放,导致内存占用不断增加,最终耗尽系统资源。内存泄漏是一个常见的编程问题,它指的是程序在使用完内存后未正确释放,导致内存占用不断增加,最终耗尽系统资源。 阅读详情

相关推荐

Cadence Virtuoso里搞定斩波运放AC仿真:PSS+PAC保姆级设置避坑指南

然而,当工程师们尝试在Cadence Virtuoso环境中对这种特殊结构进行AC特性分析时,往往会遇到传统AC仿真方法失效的困境——这正是PSS(Periodic Steady-State)与PAC(Periodic AC)仿真组合大显身手的场景。实际项目中我们常采用"先快后精"的两步法:先用快速设置确认大体趋势,再针对关键频段进行精细仿真。例如某次设计迭代中,将harmonics从10增加到20后,发现在1MHz处的相位裕度估算误差达15°,这解释了之前样机测试时的振荡问题。

weixin_33508411的博客 449

node中后台安全的防护

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可获取!x-oss-给大家,狂戳这里即可获取**[外链图片转存中…(img-J7RC2XFM-1712948843382)]!x-oss-接下来我将给各位同学划分一张学习计划表!

dzqxwzoe的博客 1173

温度实时检测预警系统(STC89C51RC+DS18B20)

温度实时检测预警系统

1 兴趣 2 实践 1495

nodejs+MQTT协议实现远程主机控制

MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。 所谓物联网,就是“万物互联”,我们的电脑、工控机、开发板什么的也是“物体”,当然也可以加入“物联网”。 远程控制电脑,有很多种方法,如Mstsc、TeamViewer、VNC、SSH、QQ远程等。在我参与过的几个物联网项目中,有这么一个...

深夜代码酒神 2万+

基于LTspice的共模电感差模/共模插入损耗仿真指南

在电源与EMC设计领域,插入损耗是衡量滤波器件抑制噪声能力的核心指标。共模电感作为EMI滤波器中最常见的元器件之一,其差模与共模插入损耗特性直接影响整体滤波方案的合规性。然而,仅依赖规格书曲线往往难以覆盖真实应用中的阻抗条件,借助SPICE仿真工具进行电路级验证已成为工程师常用的手段。LTspice凭借其轻量、高效的交流分析能力,能够帮助设计者快速搭建共模电感等效模型,并通过调整耦合系数、寄生电容等参数,还原漏感与谐振行为。本文以Wurth Elektronik的WE 744821201型号为例,从基本测试

weixin_27252001的博客 290

Java开发者必看:Apache PDFBox实现PDF数字签名完整指南(附源码)

本文为Java开发者提供了使用Apache PDFBox实现PDF数字签名的完整指南。详细介绍了从环境配置、核心原理到完整代码实现的全过程,涵盖证书管理、签名位置计算、性能优化及实际应用案例,并附有可直接复用的源码,帮助开发者高效集成PDF数字签名功能。

o1p2q3r的博客 339

nodejs内存泄露

处理方式: 删除c盘\用户\系统名\.npmrc文件删除掉

weixin_42268834的博客 127

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1280

Node.js踩坑之旅(一)

我作为一个初学者,在看书写代码的时候难免会遇到一些坑,我想把自己经历的大大小小的一些坑写出来。不仅提醒自己,也是给同处相同学习阶段的人的小小的分享。 这几天看了看node.js的net模块,看到了socket对象监听data事件以及socket对象的pipe方法。 我误以为pipe方法就是将socket对象监听data事件时返回的data数据写入文件。于是我写了如下代码: let net = re...

Meskjei的博客 431

[AI] 企业内网部署大模型的三种常见方案:从“能用”到“好用”的技术选型指南

企业内网部署大模型的三种方案解析:本地模型安全但门槛高,平台方案(如Dify)最平衡推荐,混合架构适合进阶需求。关键路径是渐进式演进,从快速验证到平台化建设,核心在于流程优化而非单纯选模型。数据安全、成本可控和工程落地能力是决策重点。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 768

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 70

Node-red内存泄露解决方案

Node-RED内存优化和释放方案

weixin_44462773的博客 1464

Vue - 超强实现网页禁止浏览器缩放功能,浏览器缩放时保持网页不变形、元素不会被挤压等,屏蔽浏览器鼠标滚轮缩放页面(提供详细示例代码,一次引入整个网站无人可以搞乱你的页面布局及样式)

vue,nuxt,禁止浏览器缩放,如何用户缩放浏览器导致页面变形,网页缩放后页面变形了怎么办,怎么解决网站被缩放后元素乱套错乱,vue怎么禁止网页不被缩放,vue如何禁止浏览器缩放,vue缩放网页变形影响布局怎么办,vue电脑分辨率及缩放导致页面变形的问题,前端页面解决浏览器或者系统被放大和缩小导致的显示问题,Vue中页面自适应缩放,如何防止Vue页面缩放时变形/调整大小,Vue项目中,防止页面被缩放和放大,vue等比例缩放网页,网页缩放后界面变形咋办,禁止页面缩放,vue禁止浏览器改变窗口大小,Vue项目

🏆 前端领域优质创作者 1万+

JS 哪些操作会造成内存泄露

1.内存泄漏 指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 2.JS的回收机制 JS垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没有使用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。引用计数不太常用,标

weixin_57092157的博客 1799

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Node 案发现场揭秘 —— 未定义 “window” 对象引发的 SSR 内存泄露

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群泄露现象在生产中遇到一枚全新的内存泄露场景,因为涉及到相对偏少的 react ssr,...

程序员成长指北 1367

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【亲测免费】 Noble/node-bluetooth-hci-socket:Node.js 的蓝牙 HCI Socket 绑定库

Noble/node-bluetooth-hci-socket:Node.js 的蓝牙 HCI Socket 绑定库 1. 项目基础介绍及主要编程语言 node-bluetooth-hci-socket 是由 Noble 开发的一个开源项目,它提供了一个 Node.js 的蓝牙 HCI (Host Controller Interface) Socket 绑定库。该库主要用于在 Node.js 环...

gitblog_00639的博客 562

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

chrome内存泄露(一)、内存泄漏分析工具

    内存分析使用的工具包括chrome任务管理器、chrome时间轴(低版本是Timeline,高版本对应performance)、chrome memory(低版本是chrome profiles,主要用JS堆快照、JS堆动态分配时间轴)。文中分析所用chrome版本是68。 使用Chrome任务管理器,了解网页使用的内存量。 使用时间轴记录可视化内存使用。 使用堆快照标识分离的DOM...

c11073138的博客 5万+

Nodejs - 内存泄露调查

Nodejs - 内存泄露调查内存使用设置设置例插件安装memwatch-next安装测试代码追加HeapDump安装测试代码追加压力测试后的结果Google DevTools比较文件 Nodejs内部使用V8的解析器,内存使用上限大约为 1.7G 左右, 内存的回收机制却是,一直占用,直到快满的时候才释放回收。 虽然EC2的类型设置为了 m5 的内存优化类型,但是node服务器的性能并没有改善,...

风吹草动的博客 1442

JS哪些操作会造成内存泄露

内存泄漏:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 1、JS的回收机制 JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收

michael8512的博客 1万+

centos node 进程保护_初探性能分析之Node.js

字节跳动内推啦常见性能问题内存泄露作用域未释放:闭包及时释放缓存空间没有限制:利用lru-cache模块队列消费不及时:限制队列长度线程阻塞采用单进程方案+线程池方案实现对大并发的支持node 模块中IO密集型任务、CPU密集型任务都是采用线程池完成自定义任务也可以通过C++模块箱libuv提交任务​​​事件轮询线程本身并不维护队列,而是一大堆文件描述符​​同步IO调用(fs.xxxSync)直接...

weixin_29013129的博客 307

Node.js 连接 MySQL

模块选择:使用mysql2模块,支持回调和 Promise,推荐 Promise 方式以简化异步代码。连接方式:单次连接适合简单脚本,连接池适合高并发场景。安全与性能:使用参数化查询防止 SQL 注入,优化数据库索引和连接池配置。实际应用:结合 Express 等框架,轻松构建 REST API 或 Web 应用。如果你需要更复杂的示例(如事务处理、分页查询)或有其他问题,请随时告诉我!

likuoelie的博客 1429

排查项目中的内存泄露

当开发者明确知道与内存泄漏关联的用户交互步骤时,可以生成多次内存快照进行对比,排查出泄漏的对象:在做用户交互操作之前,进行一次正常内存堆栈信息的快照;通过生成的结果可以直观查看到内存时间线,了解内存随时间的占用变化,如果内存占用曲线成阶梯状一直上升,则可能存在内存泄漏。打开准备分析的页面和 DevTools 的 Performance 面板,勾选 Memory 并开始录制,在模拟用户操作一段时间后结束录制,DevTools 会将这段时间内的页面行为活动进行记录和分析。检查内存大小,作为内存泄漏的辅助判断。

qq_65665724的博客 2261

js比较时间大小_初探性能分析之Node.js

字节跳动内推啦常见性能问题内存泄露作用域未释放:闭包及时释放缓存空间没有限制:利用lru-cache模块队列消费不及时:限制队列长度线程阻塞采用单进程方案+线程池方案实现对大并发的支持node 模块中IO密集型任务、CPU密集型任务都是采用线程池完成自定义任务也可以通过C++模块箱libuv提交任务​​​事件轮询线程本身并不维护队列,而是一大堆文件描述符​​同步IO调用(fs.xxxSync)直接...

weixin_39569112的博客 616

js哪些操作会在造成内存泄露

内存泄漏:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 1、JS的回收机制 JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变...

北寻北爱 780

如何追踪 JavaScript 对象是否被 GC

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群前言:在自带垃圾回收的语言中,开发者往往不需要过多地关注内存管理。但是不代表我们可以完全忽略它。因为语言引擎的垃圾回收是有一定的判断规则的,如果我们的变量所引用的内存没有符合这个规则,那么引擎无无法对这些内存进行自动回收。所以如何追踪变量的内存是否被回收也变得非常重要,尤其在 Node.js 中。...

程序员成长指北 303
上一篇: leetcode:Two Sum
下一篇: lua-md5 for lua5.3
smallmelon
博客等级 码龄16年 22粉丝 50原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值