let leak1 () =
    let thread () =
        async {
            let x = Array.create 1024 0uy
            return ()
        }
        |> Async.Start

    async {
        while true do
            do thread ()
    }
    |> Async.RunSynchronously

let leak2 () =
    let a1 () = async.Return()

    let a2 () =
        async {
            let! complete = Async.StartChild(a1 ())
            return! complete
        }
        |> Async.Start

    let rec loop (k: int) =
        if k > 0 then
            do a2 ()
            loop (k - 1)

    loop 100000
    stdout.Write("PRESS ANY KEY") // >200 Mb memory use, retained
    System.Console.ReadLine()
    |> ignore