0

爲什麼外部代碼應該調用 v8::Isolate::AdjustAmountOfExternalAllocatedMemory,以前稱爲v8::V8::AdjustAmountOfExternalAllocatedMemory並且一起也被稱爲NanAdjustExternalMemory爲什麼要調用AdjustAmountOfExternalAllocatedMemory

我在網上看到這些函數存在的一些文檔,並且它們以某種方式幫助它的垃圾收集器。但是如何?爲什麼?如果某些外部代碼不是調用這些,會產生什麼影響?在使用異步執行的Node.js模塊中,將工作線程的內存分配更改傳遞給可安全調用此函數的v8線程是否值得付出努力?爲什麼要關心外部代碼使用多少內存?如果有充分的理由,我是否應該嘗試爲每個mallocfree提供細化更新,或者我應該每隔一段時間只調用一次函數,當情況發生顯着變化時?

回答

3

您應該只更新由JavaScript對象保持活動的內存。 I.E.你有一個指向它擁有的C內存的javascript對象的SetInternalField

這似乎並不像你說你的情況:

是否值得從工作線程回V8線程通信在內存分配的變化,其中該功能可以努力安全地稱爲

無論您的工作人員分配什麼內存,都無法通過某些「單獨的v8線程」保持活動狀態,因爲隔離區只能由單個線程執行。所以它不能保持其他線程分配的內存,所以它是不相關的。


一般要調用這個函數,因爲它會迫使V8更經常做全球GC,它通常避免不惜一切代價做。例如。如果你有1000個死JavaScript緩衝區,每個預留20MB,你有20GB的垃圾,而V8認爲你只有20kb的垃圾,因此不會嘗試GC任何東西。如果你接着告訴V8有20GB的外部存儲器(AdjustAllocatedMemory(20 * 1024 * 1024 * 1024)),它會觸發一個全局GC,這將GC GC JavaScript緩衝區對象,這將調用他們的終結器,你會在那裏20MB緩衝區,這將釋放20GB的記憶。