我在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
(我在註釋行中有一個示例)?
我想沒有內存泄漏高性能的代碼,所以我不想比我要更復制數據。但目前看起來我的應用程序的內存使用量變得越來越大(我不知道如何測試它,以及如何檢查切掉的內容是否會被釋放)。
>完成讀取所有數據。你什麼意思?只要客戶端連接,總是有數據需要讀取。當客戶端將斷開這個。緩衝區將隨着這個被破壞。 – bobby
@bobby - 好的,那麼這個部分很好。你沒有展示整個對象的生命週期是如何管理的,所以我無法知道它是如何被使用的。 – jfriend00