簡體   English   中英

使用尾遞歸時發生內存泄漏

[英]Memory leak while using tail-recursion

想象一下,我有這個假設函數(在javascript中):

function paginationRecursive(results) {
  let intermediate = retrieveNextPage();
  results = results.concat(intermediate)
  if (haveAllResults()) return results;
  return paginationRecursive(results);
}

是否將每個intermediate值保留在內存中,直到整個遞歸處理完成,從而每次增加每個遞歸調用的內存使用量? 還是在我們每次調用“更深”時,engine / gc足夠聰明以釋放該內存,因為它知道該變量將不再被使用?

可能是特定於引擎的(例如V8SpiderMonkeyChakra ),因此為了使這個問題不廣,我更想知道V8引擎的答案。

我認為截至目前,答案是“ 應該釋放intermediate變量,但不會釋放”。

ES6確實談到了尾位調用 ,甚至需要優化:

尾部位置調用必須在調用目標函數之前釋放與當前正在執行的函數執行上下文關聯的任何臨時內部資源,或者重新使用那些資源以支持目標函數。

JS中對TCO(尾部調用優化)的體面概述是http://2ality.com/2015/06/tail-call-optimization.html

綜上所述,該頁面鏈接到該表,表明幾乎沒有運行時實際支持它: https : //kangax.github.io/compat-table/es6/#test-proper_tail_calls_(tail_call_optimisation)

這個r/node reddit線程提供了一些見解並鏈接到此v8博客文章 ,其中包括:

V8團隊強烈支持使用特殊語法表示正確的尾部調用。 有一個懸而未決的TC39提案,稱為句法尾部調用,以指定這種行為,由Mozilla和Microsoft的委員會成員共同倡導。 [...] V8小組計划在下一次TC39會議上解決此問題,然后默認提供隱式的正確尾部調用或語法尾部調用。

也就是說,V8不想按規定實現該ES6功能,而是希望使用顯式的尾部調用語法,例如為TC39建議的語法

另請參閱: JavaScript尾調用中的函數是否已優化?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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