我已经对我的node.js应用程序进行了一些测试,以查找我的代码应该执行的内存泄漏.我运行脚本,在我看来应该泄漏内存,但我对结果感到惊讶.
redisClient.on('message', initRequest);
function onSuccess(self, json){
console.dir(json);
}
function initRequest(channel, message){
var request = new RequestObject({
redisMessage: message
});
request.on('success', onSuccess);
}
Run Code Online (Sandbox Code Playgroud)
redisClient每秒发出一对'message'事件.这意味着initRequest经常调用函数.每次request在内存中创建对象,并且函数onSuccess绑定到其"成功"事件.
我假设(但在这里我可能是错的),只要有监听器(onSuccess在这种情况下)绑定到这个对象它就不能被垃圾收集.然后我想,内存使用会增长,因为内存不会被释放.
作为这种潜在泄漏的解决方案,我想使用.once而不是.on,因为这将取消绑定侦听器和对象可能被垃圾收集.
我用pmap来测试两种情况(比较.on和.once另外一种情况,这里不值得一提),我没有发现很大的不同.

总结一下,我有两个问题:
这种正常的GC行为是在某些时间间隔内清除内存,还是在达到某种威胁后而不是连续清洁?
我是否正确地假设示例代码.on应该泄漏内存,我在内存消耗图上看不到?
我尝试做使用Linux作为perf_events由布伦丹·格雷格描述的一些分析的NodeJS 这里.
工作流程如下:
--perf-basic-prof,这将创建/tmp/perf-(PID).map写入JavaScript符号映射的文件.perf record -F 99 -p `pgrep -n node` -g -- sleep 30stackcollapse-perf.pl脚本折叠堆栈flamegraph.pl脚本生成svg火焰图我得到以下结果(开头看起来非常好):

问题是有很多[unknown]元素,我认为应该是我的nodejs函数调用.我假设整个过程在第3点失败,其中perf数据应该使用由node/v8生成的映射来折叠--perf-basic-prof./tmp/perf-PID.map在节点执行期间创建文件并将一些映射写入其中.
如何解决这个问题呢?
我使用的是CentOS 6.5 x64,并且已经尝试使用节点0.11.13,0.11.14(预建和编译),但没有成功.
我想知道node.js是否适用于服务器端应用程序,它实际上并不与浏览器进行通信,或者浏览器通信只是整个应用程序的一部分,而不是用于管理.
这个想法很简单:
服务器接收大量UDP流量,其中包含来自其他服务器的用户数据的短消息.
对于每个消息,应用程序执行数据库查找并过滤掉不在白名单中的用户标识的消息.
处理过滤的消息,导致另一个数据库更新,或将数据发送到另一个服务器.
是这样的情况,学习node.js的好方案,或者与Java EE相比,它没有任何好处?
如何处理重叠svg元素上的点击事件?我正在使用Reaphael.js库.
问题是顶级<svg>DOM元素正在拦截鼠标事件,即使底部元素没有被任何绘图重叠.我的问题是如何让我的例子中的两个圆圈都可以点击并仍然将它们保存在两个svg元素中?
这是我的代码:
CSS:
#container {
position: relative;
width: 200px;
height: 200px
}
#container>svg {
position: absolute !important;
top: 0;
left: 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
var topLayer = Raphael('container', 200, 200);
var bottomLayer = Raphael('container', 200, 200);
topLayer.circle(100, 100, 50)
.attr({
fill: 'red',
stroke: false
})
.mousedown(function(){alert('Top layer')});
bottomLayer.circle(120, 120, 50)
.attr({
fill: 'pink',
stroke: false
})
.mousedown(function(){alert('Bottom layer')});
Run Code Online (Sandbox Code Playgroud)
工作Jsfiddle的例子
PS:我知道我可以在单个<svg>DOM元素中实现分层,但事实并非如此.我的底部SVG元素具有缩放和平移功能,而顶部SVG元素应该是静态的.
我正在使用jQuery Validate插件。仅在用户完成键入后如何使它验证输入。从第一个键入的字母返回错误的默认行为似乎不是非常用户友好的IMO。
javascript ×5
node.js ×3
backbone.js ×1
dom-events ×1
jquery ×1
memory-leaks ×1
perf ×1
performance ×1
profiling ×1
raphael ×1
svg ×1
v8 ×1