我正在使用節點,並且正在考慮在節點中手動運行垃圾回收。這有什麼缺點嗎?我這樣做的原因是它看起來像節點沒有足夠頻繁地運行垃圾收集。有誰知道V8多久會在節點中做垃圾收集程序?在節點中手動運行垃圾回收
謝謝!
我正在使用節點,並且正在考慮在節點中手動運行垃圾回收。這有什麼缺點嗎?我這樣做的原因是它看起來像節點沒有足夠頻繁地運行垃圾收集。有誰知道V8多久會在節點中做垃圾收集程序?在節點中手動運行垃圾回收
謝謝!
V8當他認爲它是互動時運行垃圾收集。這沒有固定的延遲。您可以閱讀本文以瞭解垃圾回收V8:https://strongloop.com/strongblog/node-js-performance-garbage-collection/
無論如何,在您的項目中手動運行垃圾收集器是一個壞主意,因爲它完全阻止了節點進程。所以在垃圾回收期間,你的程序不會處理任何請求。
我實際上在1ku的情況下在heroku上運行節點的問題相同。
在生產流量上運行節點服務器時,內存會不斷增長,直到超過內存限制,導致其運行緩慢。
這可能是由應用程序產生大量垃圾所引起的,它主要提供JSON API響應。但它不是內存泄漏,只是未收集的垃圾。
看來,節點沒有優先考慮在舊對象空間上爲我的應用做足夠的垃圾回收,所以內存會不斷增長。
手動運行global.gc()(使用節點--expose_gc啓用)會每次減少50MB的內存使用量,並會將應用程序暫停大約400ms。
我最終做的是按照隨機時間表手動運行gc(以便heroku實例不會一次執行GC)。這減少了內存使用量並停止了內存配額超過錯誤。
的簡化版本是這樣的:
function scheduleGc() {
if (!global.gc) {
console.log('Garbage collection is not exposed');
return;
}
// schedule next gc within a random interval (e.g. 15-45 minutes)
// tweak this based on your app's memory usage
var nextMinutes = Math.random() * 30 + 15;
setTimeout(function(){
global.gc();
console.log('Manual gc', process.memoryUsage());
scheduleGc();
}, nextMinutes * 60 * 1000);
}
// call this in the startup script of your app (once per process)
scheduleGc();
您需要與垃圾收集暴露運行你的應用程序:
node --expose_gc app.js
我知道這可能是一個有點緩慢回覆的幫助OP,但我想我會協同我最近的經驗與節點JS內存分配和垃圾收集。
我們目前正在研究運行在樹莓派3上的節點JS服務器。每隔一段時間它就會因內存不足而崩潰。我最初認爲這是內存泄漏,經過一週半的搜索我的代碼並且什麼也沒有找到,我認爲這個問題可能會因爲Node JS分配的內存比Rpi3上的可用內存更多而加劇其執行GC之前的過程。
我已經運行我的服務器的新實例,用下面的命令:
「節點server.js --max-可執行文件大小= 96 --max歲的空間大小= 128 --max -semi-space-size = 2'
這有效地限制了節點在本地計算機上佔用的總空間量,並強制垃圾收集更頻繁地完成。到目前爲止,我們看到了內存的不斷使用,它向我確認我的代碼最初並沒有泄漏,而是節點分配的內存超過了可能。
編輯:這裏的鏈接更具體的概述了我正在處理的問題。
- nodejs decrease v8 garbage collector memory usage - https://github.com/nodejs/node/issues/2738
什麼問題你真的想解決(我們展示相關的代碼),你是如何測量內存使用情況。我懷疑你有一個測量問題而不是垃圾收集問題,因爲垃圾收集是在node.js空閒時間內運行的,並且通常只是一個問題,如果你有一個非常長的執行線程會創建大量的臨時對象。在正常的node.js服務器環境中,應該有足夠的空閒時間(使用適當的異步編程時)。 – jfriend00
這可能值得閱讀本文:https://strongloop.com/strongblog/node-js-performance-garbage-collection/ – jfriend00
我正在使用 ps --sort -rss -eo rss,pid,command |用於檢查內存的頭部 。我使用的是亞馬遜服務器(免費層),因此只有1個內存。如果我開始在此上運行我的應用程序的多個實例並且不手動進行垃圾收集,則直到服務器崩潰時纔會使用內存使用率高的空間 –