问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

node扩展 memwatch分析

发布网友 发布时间:2024-10-12 04:58

我来回答

1个回答

热心网友 时间:2024-11-07 23:31

memwatch是一个C++扩展,主要用于检测Node.js中的内存泄漏问题。它的基本用法包括配置文件binding.gyp,以及src目录下的多个源文件如heapdiff.cc、init.cc、memwatch.cc、util.cc。这些文件通过node模块系统在编译过程中找到依赖的nan目录。memwatch的入口函数在init.cc文件中,通过`NODE_MODULE(memwatch, init);`声明。当执行`require('@airbnb/memwatch')`时,首先调用init函数,此函数接收`v8:Handle target`作为参数,类比于Node.js的`mole.exports`的`exports`对象。函数内部主要分为三部分:初始化`target`、绑定`upon_gc`和`gc`两个函数,并在Node.js的`gc`前后分别挂上对应的钩子函数。

在`heapdiff.cc`文件中,`heapdiff::HeapDiff::Initialize(target);`的实现创建了一个名为HeapDiff的函数`t`,同时在`t`的原型链上绑定了`end`方法,使得JS层面可以执行`var hp = new memwatch.HeapDiff(); hp.end()`。

当JS执行`new memwatch.HeapDiff();`时,C++层面调用`heapdiff::HeapDiff::New`函数,其精简版如下:用户在JS层面执行`var hp = new memwatch.HeapDiff();`时,C++层面通过Node.js的API对堆上内存打一个快照保存到`self->before`中,并将当前对象返回出去。

`memwatch.HeapDiff.End`实现当用户执行`hp.end()`时,会执行原型链上的`end`方法,即C++的`heapdiff::HeapDiff::End`方法。其简化版如下:拿到当前的HeapDiff对象后,再对当前堆上内存打一个快照,通过`compare`函数对比前后两个快照后得到`comparison`,然后将快照释放,并将结果通知给JS。

`compare`函数内部会递归调用`buildIDSet`函数得到堆快照的差结果。`buildIDSet`函数构造了两个对象`b(before)`、`a(after)`用于保存前后两个快照的详细信息。在实现中,构造了JS对象描述如下:进一步对前后两次的快照进行分析可以得到`o`,`o`中的`before`、`after`对象就是前后两次的快照引用。

`buildIDSet`、`setDiff`以及`manageChange`函数实现分别用于:从堆快照的根节点出发,递归寻找所有可达节点,做DFS统计所有可达节点的同时,也统计当前堆占用的内存大小;计算集合差集;做数据聚合。这些函数具体实现不在赘述。

`upon_gc`和`gc`方法在`init`函数中声明。`gc`方法实际上对应`memwatch::trigger_gc`,通过`Nan::IdleNotification`和`Nan::LowMemoryNotification`触发V8的GC功能。`upon_gc`方法绑定了一个函数,当执行到`gc`方法时,就会触发该函数,其中`info[0]`是用户传入的回调函数。

`memwatch::before_gc`和`memwatch::after_gc`方法实现,前者开始记录时间,后者在GC后记录结果到`GCStats`结构体中。将结果保存到`barton`中,通过`libuv`的`loop`触发回调函数,用户可以获取到GC的统计结果,并通过回调函数处理。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
陈八两面馆的什么面最好吃? 杭州湾跨海大桥可以骑行吗 杭州湾跨海大桥上能骑车吗? ...不知道可不可以骑自行车,又需要做哪些准备,谢谢各位资深人士了... 激光祛痘坑的效果如何? 口述:3个闺密分享1个“软饭男” 骚气文案暗示-推荐65句 三个男人怎么晒朋友圈 任钊的介绍 请问德阳青依江路口到德阳中级人民法院坐几路公交车 Node.js 正在衰退吗?通过一些关键指标告诉你事实如何! nodejs深入学习系列之libuv基础篇(一) 逗小猴开心2第15关怎么过啊?(急) 逗小猴开心之四个世界2全关卡图文攻略汇总介绍_逗小猴开心之四个世界... 逗小猴开心2游戏介绍 月薪3000的上班族,如何穿出万元高级感? 海上难闻的气味用什么来形容比较好?(比如恶臭;海上传来阵阵恶臭) 最好... nodejs安装ionic时出现问题,cmd安装时是成功的,也做了跨域处理,可是创 ... ...双方都有孩子,没在我们名下,现在育有一女,还能在生一胎吗... 骄傲去吧!盛产学霸级男神女神的星座 ...iRobot.zip”(773.00KB)接收中止,该文件已经接收0KB。再次接... 如图甲,在6乘6的方格纸中,给出下列3种变换,P变换,Q变换,R变换 qq离线文件发不 网络连接失败,“我的照片.rar”(37.00KB)接收中止,该文件已经接收... ...离线文件,在公司就收不到,提示遇到网络错误,该文件已经接收0KB... 发送离线文件时遇到网络错误,该文件已经发送0KB。发送不成功,但有的... nodejs 读写文件 七爪源码:如何在 NodeJS 中将音频文件转换为视频 多玩下的极品飞车14怎么安装? 中国民航大学周围哪家宾馆便宜 幽门螺杆菌怕什么食物 吃什么杀幽门螺杆菌 要善于在事物的对立中把握统一,在统一中把握对立,对吗 浦东新区人民政府办公室处室设置 我想做一个四轴的四旋翼的航模,大约多少钱? 浦东新区人民政府办公室领导分工 浦东新区人民政府办公室基本概况 浦东临港新城管理委员会处室职责 浦东新区卫生局内设处室 浦东新区教育局机构设置 上海道汕头乘坐火车的最佳路线? 上海到汕头怎么做车最省钱<火车> 上海到汕头的路程(火车票) 为什么苹果4打开什么软件都需要登录AppleID 苹果4打开软件的时候显示输入Apple ID密码,输入后就显示被禁用,需要重 ... 3个月婴儿可以吃罗汉果吗 想学英语,朋友推荐新世界,想知道新世界英语好吗? 联想Y460怎么系统重装了下显存就变60Mb了 用鲁大师测Y460的独立显卡HD5650显存怎么显示只有730M raptor是什么龙