[英]How to request the Garbage Collector in node.js to run?
在啟動時,我的 node.js 應用程序似乎使用了 memory 的大約 200MB。如果我暫時擱置它,它會縮小到大約 9MB。
是否可以從應用程序內:
我問的原因是,我從磁盤加載了一些臨時處理的文件。 這可能會導致 memory 使用量激增。 但是我不想在 GC 運行之前加載更多文件,否則有我會用完 memory 的風險。
有什么建議么?
如果您使用--expose-gc
標志啟動節點進程,則可以調用global.gc()
以強制節點運行垃圾收集。 請記住,節點應用程序中的所有其他執行都會暫停,直到 GC 完成,所以不要經常使用它,否則會影響性能。
在從代碼中進行 GC 調用時,您可能希望包含一個檢查,這樣如果節點在沒有標志的情況下運行,事情就不會變壞:
try {
if (global.gc) {global.gc();}
} catch (e) {
console.log("`node --expose-gc index.js`");
process.exit();
}
Node允許我們手動觸發垃圾收集。 這可以通過使用--expose-gc
標志運行Node來實現(即node --expose-gc index.js
)。
一旦節點以該模式運行,您可以通過從程序中調用global.gc()
來以編程方式觸發垃圾收集。
前 -
// Force garbage collection every time this function is called
try {
if (global.gc) {global.gc();}
} catch (e) {
console.log("`node --expose-gc index.js`");
process.exit();
}
當您出於任何原因無法在啟動時將--expose-gc
標志傳遞給您的節點進程時,您可以嘗試以下操作:
import { setFlagsFromString } from 'v8';
import { runInNewContext } from 'vm';
setFlagsFromString('--expose_gc');
const gc = runInNewContext('gc'); // nocommit
gc();
筆記:
此方法應謹慎使用。 在 VM 啟動后更改設置可能會導致不可預測的行為,包括崩潰和數據丟失; 或者它可能什么都不做。
我建議的一件事是,除非您在啟動時需要這些文件,否則請嘗試僅在需要時加載它們。
編輯:請參閱上面的帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.