Node.js的文档中好像不再推荐new Buffer()方法了,看原因的时候,有这么一句:
The memory allocated for such Buffer instances is not initialized and can contain sensitive data. Such Buffer instances must be initialized manually by using either buf.fill(0) or by writing to the Buffer completely.
意思好像是说为这种方式创建的Buffer对象分配的内存并不是新申请的,而且可能会包含敏感信息?这样的Buffer实例必须手动填满。
这是为什么?
我不是计算机专业出身,有些地方不太理解。我查了下《深入浅出Node.js》的Buffer内存管理部分,确实是用的slab分配策略,小对象的话,是可能使用已经存在的slab单元的。但是使用不是应该是剩下的空白内存部分么?怎么会可能包含信息?而且为什么必须完全地手动来填满?我没学过计算机原理,这块实在不能理解,空着一块内存确实是浪费,但是为什么必须要填满。。。
PHP中文网2017-04-17 14:46:30
打個比方。你是店家(node),客人(程式設計師)來吃飯,你為客戶提供碗筷(記憶體塊),但是客人在吃晚餐後不會洗碗(JS沒有析構函數一類的東西)。
你為了效率,會重複利用碗筷(slab,記憶體重複使用)。
一開始有一部分全新的碗筷給客人用(空白內存),漸漸地,所有碗筷都被用過至少一次了(所有空白內存都被使用過了)
new Buffer()
你把碗筷直接給客戶了。如果上位客人沒有把碗裡的東西清空(析構),那麼客人可以輕易地知道上個人吃的是大米飯還是小米飯。所以客人用碗筷前必須洗碗。
問題在於何時洗碗。
你用new Buffer()
,就表示你只負責重新利用碗筷,客人負責在吃飯前清洗碗筷。而你要是使用Buffer.from
則是你不僅負責重新利用碗筷,還有在給客戶之前清洗一下,客人直接使用碗筷。
兩種方法各有利弊,Unsafe直接分配內存,不用初始化內存,適合我要寫1024個字節,我分配1024個字節的buffer;分配到buffer,我直接寫入,初始化不初始化其實無所謂。而Buffer.alloc額外初始化一下,如果我要寫的資料不知道多少,只是<1024, 那我就Buffer.alloc(1024)。這樣,即時全部讀出來,後面的部分也是