Подтвердить что ты не робот

Утечка памяти при рекурсивном вызове асинхронного вызова F #

Я смущен, почему эта функция постоянно увеличивает память.

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 36972 37016 37060 37104 37148 37192 37236 37280 37324 37368 37412 37456 37500 37544 37588 37632 37676 37720 37764 37808 37852 37896 37940 37984 38028 38072 38116 38160 38204 38248 38292 38336 38380 38424 38468 38512 38556 38600 38644 38688 38732 38776 38820 38864 38908 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.

4b9b3361

Ответ 1

Цитата из здесь (конец статьи):

"Кроме того, у F # async также есть свои проблемы (наиболее распространенная проблема заключается в том, что функции хвостовой рекурсии должны использовать return! вместо do!, чтобы избежать утечек)"