簡體   English   中英

F#異步遞歸調用中的內存泄漏

[英]Memory leak in F# async recursive call

我很困惑為什么此功能顯示內存不斷增加

let rec startRead1() = 
  async {
    do! Async.Sleep 1
    System.GC.Collect()
    let mem = System.GC.GetTotalMemory(true)
    printfn "%d" mem
    do! startRead1()
  }

25676 36760 36840 36884 36928 37972 37016 37060 37456 37456 37500 37544 37588 37632 37676 37676 37720 37764 37808 37852 37378 37896 37896 37940 37984 38984 38072 38072 38116 38160 38204 38248 38292 38336 38380 38380 38424 38468 38512 38556 38600 38644 38688 38732 38886 38864 38952 38996 39040 39084 39128 39172 39216 ^ C按任意鍵繼續。

[<EntryPoint>]
let main _ = 
  startRead1() |> Async.RunSynchronously
  0

而這個顯示穩定的記憶

let rec startRead2() = 
  async {
    while true do
      do! Async.Sleep 1
      System.GC.Collect()
      let mem = System.GC.GetTotalMemory(true)
      printfn "%d" mem
  }

同步版本也很穩定。

let rec startRead3() = 
  System.Threading.Thread.Sleep 1
  System.GC.Collect()
  let mem = System.GC.GetTotalMemory(true)
  printfn "%d" mem
  startRead3()

我正在發布模式下運行,沒有連接調試器,FS 3.1,.NET 4.5.1。

這里引用(文章結尾):

而且,F#異步也有問題(最常見的陷阱是尾遞歸函數必須使用return!而不是do!以避免泄漏)

暫無
暫無

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

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