2011-03-16 210 views
7

我從這個線程garbage collection with node.js瞭解到,node.js使用分代GC。我常規使用循環對象引用(我最終刪除/確保超出範圍),並且想知道node.js是否處理得很好。因此,例如。如果它是使用ref完成的。計數,會有一個問題,所以我想知道節點在這方面有多好。Node.js的垃圾收集器

一些使用場景:

  1. 對於每一個http請求,創建與潛在地具有到範圍的對象的引用的λ一個的setTimeout。範圍對象也具有對超時對象,等等的引用...

  2. 對於每個用戶會話,我有一個 指針 (還在做C編程)參照http請求對象也具有對引用會話對象等...請求對象經常被刪除,但會話對象不是。

編輯:我想問,因爲這個鏈接,我在網上找到http://lifecs.likai.org/2010/02/how-generational-garbage-collector.html

回答

10

正如你提到的,使用的NodeJS一個代GC ......特別v8的。因此,它不做引用計數類型的GC。相反,它做了一個完整的標記和掃描型GC。

所以,只要你擺脫了所有對一組對象的引用(即使它們循環指向另一個對象),它們也應該在某個時刻收集垃圾。

這並不意味着你不應該關心GC。如果你有一個非常活躍的NodeJS服務器,那麼垃圾收集器將非常難以清理垃圾,特別是如果你有很多「中等壽命」對象(即不是短或長壽命)。

+0

由於見IPCNode代碼。你知道node.js(v8)GC是在另一個線程還是在同一個線程上運行(和js執行一樣)嗎?你有相同的鏈接,我可以查找嗎? – dhruvbird 2011-03-17 05:05:48

+0

同一線程。這是一個停止世界的代GC ...但其他大多數人也是如此。這裏有一些信息(http://code.google.com/apis/v8/embed.html#handles),但它可能對您沒有用處。如果您擔心某些事情,您可能需要首先查看人們在.NET或Java中使用的解決方案,但他們在GC方面會有相似之處。你可以在stackoverflow上總是詢問具體的問題:) – Amir 2011-03-17 05:23:48