簡體   English   中英

如何請求node.js中的垃圾收集器運行?

[英]How to request the Garbage Collector in node.js to run?

在啟動時,我的 node.js 應用程序似乎使用了 memory 的大約 200MB。如果我暫時擱置它,它會縮小到大約 9MB。

是否可以從應用程序內:

  1. 查看應用程序使用了多少 memory?
  2. 請求垃圾收集器運行?

我問的原因是,我從磁盤加載了一些臨時處理的文件。 這可能會導致 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM