【发布时间】:2015-04-19 15:48:37
【问题描述】:
我在 Node.js 上有服务器端的基于 TCP 的客户端/服务器应用程序。因为 TCP 是一个流,我需要单独的数据包,所以我在每个数据包之前发送两个字节的长度(我猜是常见的做法)。大数据包可以分成几个块(由于 MTU 和其他因素),所以我需要从当前缓冲区中提取我可以提取的每个数据包,并将其余数据包与下一个传入块连接并再次解析。我想出了以下代码:
function parsePackets(data) {
// join existing buffer contents with new chunk
var buffer = Buffer.concat([this.buffer, data]);
var start = 0;
var end = buffer.length;
var packets = [];
while (true) {
// wait for at least two bytes
if (end - start < 2) {
break;
}
var length = buffer.readUInt16BE(start);
// wait until we can read whole packet
if (end - start < length) {
break;
}
// push packet data as a separate packet
//var data = new Buffer(length);
//buffer.copy(data, 0, start, start + length);
var data = buffer.slice(start, start + length);
packets.push(data);
start += length;
}
// drop parsed buffer contents, leaving the rest
//var newBuffer = new Buffer(buffer.length - start);
//buffer.copy(newBuffer, 0, start, buffer.length);
//this.buffer = newBuffer;
this.buffer = buffer.slice(start, buffer.length);
return packets;
}
我担心的是:切掉的缓冲区内容会被垃圾收集吗?我也在做concat,它返回新的缓冲区(我假设从提供的缓冲区复制内容,这意味着它们可以被垃圾收集)。或者我可能需要使用copy 而不是slice(我在注释行中有一个示例)?
我想要没有内存泄漏的高性能代码,所以我不想复制过多的数据。但目前看来我的应用程序的内存使用量越来越大(我不知道如何确定测试它以及如何检查切掉的内容是否会在某个时候被释放)。
【问题讨论】:
标签: node.js garbage-collection buffer