node 內存管理相關

爲何在node中要擔憂node內存管理

使用JavaScript進行前端開發時幾乎徹底不須要關心內存管理問題,對於前端編程來講,V8限制的內存幾乎不會出現用完的狀況,v8在node中有着內存的限制(64位1.4GB;32位0.7GB),因爲後端程序每每進行的操做更加複雜,而且長期運行在服務器不重啓,若是不關注內存管理,致使內存泄漏,node對內存泄露十分敏感,一旦線上應用有成千上萬的流量,哪怕是一個字節的內存泄露都會形成堆積,直到內存溢出。前端

查看內存使用狀況與垃圾回收

咱們可使用process.memoryUsage() 能夠查看內存的使用狀況,有rss、heapTotal、heapUsed三個值,他們分別表明常駐內存、堆中總共申請內存、目前堆中使用的內存量。要注意,rss包括但不只限於堆內存,咱們知道在js中堆儲存者對象等..rss中還有棧、代碼運行內存、堆外內存。在node中對內存的分配和內存回收主要值得是堆內存,它把堆內存分區(新生代、老生代),新生代的對象爲存活時間較短的對象,老生代的對象爲存活時間較長或常駐內存的對象。而且對這兩種分區採用不一樣的算法進行垃圾回收,新生代空間較小,將它分爲from/to兩個部分,每次檢查會將from中的存活對象複製到to中,而後釋放剩下的對象資源,以後再轉換from和to的角色。當新生代中的對象屢次被複制則將其晉升到老生代,若to中內存使用超過25%也會將後續對象直接晉升。老生代中對象存活期較長,空間較大,採用這種算法不只浪費較多並且耗時長,在老生代中採用標記法實現垃圾清除。另外還有一種算法可整合不連續的空間(耗時較長)node

咱們應該怎麼高效使用內存?

  • 主動釋放(跟js中的方法同樣)
  • 慎用閉包(跟js中緣由同樣)
  • 嘗試使用堆外內存,由於v8對內存的限制是對堆內存的限制,那麼咱們能夠嘗試去使用堆外內存
    • 使用Buffer,它不通過v8分配,是有C++申請分配的,也不須要被V8垃圾回收,必定程度上節省了V8資源,也沒必要在乎堆內存限制。
  • 當咱們須要操做大文件,應該利用Node提供的stream以及其管道方法,防止一次性讀入過多數據,佔用堆空間,增大堆內存壓力。(須要在學習)

內存泄露部分(後續補充)

相關文章
相關標籤/搜索