簡體   English   中英

node.js緩沖區不為空

[英]node.js Buffer not empty

當我創建大量Buffer它們並不總是空的:

for (var i = 0; i < 100; i++) {
    console.log((new Buffer(30)).toString('hex'));
}

(部分)輸出:

782668013a0000003b00000035000000b0c17900391100003c0000003d00
e4216801ffffffff000000000100000000000000000000003e0000003f00
40c27900100000000100000000000000000000000000000018c379000000
000000000000000000000000000000000000000000000000000000000000 --> Empty
000000000000000000000000000000000000000000000000000000000000 --> Empty
0000000000000000108269014000000041000000c86f79000cf679000000
6611000080c27900c0c27900040000000100000000000000d0c279000000
00000000000000005c2468014200000043000000cc6f7900002668014400

(部分)輸出(沒有.toString('hex')和只有new Buffer(10) ):

<Buffer 01 00 00 00 58 db 62 00 b4 86>
<Buffer 90 b9 65 00 08 00 00 00 03 00>
<Buffer 10 ba 65 00 04 00 00 00 00 00>
<Buffer 04 00 00 00 00 00 00 00 00 00>
<Buffer 10 00 00 00 00 00 00 00 70 ba>
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer ff ff ff ff ff ff ff ff 00 00>
<Buffer 00 00 00 00 0f 00 00 00 8c 6f>
<Buffer 80 ba 65 00 00 00 00 00 aa 00>

我在32位Windows 7計算機上運行node.js v0.10.33

  • 這是我的特定機器的問題嗎?
  • 這是node.js的一般問題(又稱bug)嗎?
  • 這是一個特殊組合的問題(例如只有Windows環境)?
  • 這是預期的,我必須在開始使用它之前清除Buffer嗎?
  • 這記錄了嗎?

更新: v0.11.14行為更好, v0.11.14行為v0.8.28

TL;博士

  • 您的特定機器沒有問題,它在所有機器上。
  • 不是錯誤。 所有內存分配庫中都存在此行為。
  • 不是操作系統依賴。 所有操作系統都以這種方式運行
  • 如果你需要它初始化,那么是的,使用Buffer.prototype.fill清除它
  • 是的,它在nodejs / webkit使用的底層庫中有記錄:請參閱malloc(3) / stdlib

這很可能是使用處理內存分配的API時所期望的,例如Buffer。

Buffer實際上是使用了smalloc模塊,您可以將其視為來自stdlib.h的 malloc(3) / free(3)

malloc背后的原理是它只為指針分配/保留內存 - 在webkit中,它可能看起來更接近於對象上的ExternalArray的calloc

http://linux.die.net/man/3/malloc

malloc()函數分配大小字節並返回指向已分配內存的指針。 內存未初始化。

內存分配/釋放不處理內存初始化,因為遍歷每個字節並將其設置為0會更昂貴。

除了0並不總是一個字節所需的初始值。

並且由於內存分配可以返回之前由其他進程使用過的內存塊,因此預計會在新分配的塊中包含數據。

一般規則是:在分配內存時(比如Buffer),如果需要初始化,請使用buf.fill(0) ; 雖然這並不總是需要,因為在大多數情況下,當您需要Buffer時,您已經知道了數據的長度,隱含的內容。

例如,當您創建new Buffer(30)您知道您的數據長度為30個字節,這意味着您已經知道要寫入的數據是什么樣的,所以最后您很可能最終會寫入每個字節,在將緩沖區傳遞給其他字節之前 - 因此無需預先添加將每個字節設置為0的額外初始化循環。

對於使用字節作為對象的標志/狀態的緩沖區,您只能初始化它們。

例如,如果您的Buffer(10)使用前2個字節作為某些狀態的標志,而其他8個字節用於數據,則只執行buffer[0] = buffer[1] = 0 ,將它們設置為初始0值,而不是初始化全部10個字節,然后再對最后8個進行寫操作。

最后一點:如果之前沒有使用內存分配返回的內存塊,那么是的,所有字節都設置為0.但是,內存處理是操作系統所做的 - 使用各種優化 - 因此無法預測你將得到什么內存段及其內容。

在最新版本的Node(v5.10.0 +)中,您可以使用

--zero-fill-buffers

https://nodejs.org/api/buffer.html#buffer_the_zero_fill_buffers_command_line_option

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM