在 nodejs 手動 garbage collection 的方法

前陣子因為在 Heroku 上面跑的 nodejs 程式開始不斷出現記憶體使用超量的訊息:
R14 - Memory Quota Exceeded ,加錢升 dyno (Heroku 上的 instance) 也不見好轉,只好想看看有沒有什麼方法可以改善,後來作法是手動執行 garbage collection,記憶體使用量就掉下去了 …

以 cdnjs 的 api / web server 為例,沒做 gc 的話大概要吃 410 MB 的記憶體,一模一樣的程式,有做 gc 的話只要吃 230 MB的記憶體,相差甚大,其中原由大概只能等高手指教或是等很閒的時候才有空追了 …

作法滿簡單的,執行 nodejs 的時候加上 --expose-gc 的參數,並且在你想要執行 garbage collection 的地方加入 global.gc(); 即可。

git push在處理branch name的小技巧

把程式丟到heroku跑的話預設是要用master才會run/build你的app,不過有些東西其實不適合放到master branch,例如cdnjs/new-website理面的meta data,之前因為用機器人(其實只是crontab)去更新這些資料,生了上萬個commits出來,多了一堆不必要的log,也淡化contributors list理面真正的contributors的貢獻量

剛剛花了一些時間把那些commits通通清掉,現在大概剩下兩百出頭的commits,雖然還是有一些沒拔乾淨,不過已經無傷大雅了,接下來的meta data就會丟到meta這個branch,不過問題來了,把這些資料直接push到heroku上面(因為一些原因所以不是用GitHub webhook而是自己push)會得到這樣的訊息:

Pushed to non-master branch, skipping build.

目前想的到最簡單的解決方法是這樣:
git push heroku meta:master

也就是在branch名稱後面多了一個:master,意即把本機的meta分支push到heroku這個remote上的master branch

同理也可以在pull的時候這樣做:

git pull upstream master:base

意即把upstream上面的master分支拉到local的base分支上

然後 … 就沒有然後了,滿簡單好用的方法@@