gpt4 book ai didi

garbage-collection - 影子绑定(bind)会被 GCed 吗?

转载 作者:行者123 更新时间:2023-12-04 07:55:42 26 4
gpt4 key购买 nike

假设我在一个长期运行的 ml 文件中有这个:

let l = [1;2;3]

let l = [1;2;3;4]

let _ = ...

请问第 l = [1;2;3]有时会被GC?

如果代码是这样的:
let l = [1;2;3]

let l = [1;2;3;4]

let l = [1;2;3]

let _ = ...

共有三个 l . 1st 被 2nd 遮蔽,然后 2nd 被 3rd 遮蔽。

由于GC的时间表未确定,以下情况是否可能?
  • 当到达第 3 l , GC 没有收集到第一个 [1;2;3] , 所以相同的内存被重用或重新引用
  • 紧接第二次 l , GC 收集了第 1 个 [1;2;3] ,然后是第三个 l[1;2;3] 创建新内存
  • 最佳答案

    不在 OCaml 顶层,定义新值 l不释放以前的l ,它(据我记得实现)永远存在。没关系,因为它是一个常数,并且只占用与产生它的源代码成比例的空间,就像二进制代码一样。

    $ rlwrap ocaml
    OCaml version 4.00.1

    # let l = [ 1 ] ;;
    val l : int list = [1]
    # let w = Weak.create 1 ;;
    val w : '_a Weak.t = <abstr>
    # Weak.set w 0 (Some l) ;;
    - : unit = ()
    # Gc.full_major () ;;
    - : unit = ()
    # Weak.check w 0 ;;
    - : bool = true
    #

    这个 true meansl还活在内存里。
    # let l = [ 2 ] ;;
    val l : int list = [2]
    # Weak.check w 0 ;;
    - : bool = true
    # Gc.full_major () ;;
    - : unit = ()
    # Weak.check w 0 ;;
    - : bool = true
    #

    它仍然没有,尽管对于可达性的精细定义(不是 GC 使用的定义),它不是“可达性”的。

    两个编译器都没有释放原始的 l任何一个:
    $ cat t.ml
    let l = [ 1 ] ;;
    let w = Weak.create 1 ;;
    Weak.set w 0 (Some l) ;;
    Gc.full_major () ;;
    Printf.printf "%B\n" (Weak.check w 0) ;;
    let l = [ 2 ] ;;
    Printf.printf "%B\n" (Weak.check w 0) ;;
    Gc.full_major () ;;
    Printf.printf "%B\n" (Weak.check w 0) ;;
    $ ocamlc t.ml
    $ ./a.out
    true
    true
    true
    $ ocamlopt t.ml
    $ ./a.out
    true
    true
    true

    GC 对“可达性”的定义比人们可能喜欢的定义更接近的另一个例子是:
    let g () = Gc.full_major ()

    let f () = let l = [ 1 ] in (* do something with l; *) g(); 1

    g被执行(从 f 调用),值 l不再可达(对于可达的精细定义)并且可以被垃圾收集。这不会是因为它仍然是从堆栈中引用的。 GC 具有粗略的可达性概念,只有在 f 之后才能释放它。已终止。

    关于garbage-collection - 影子绑定(bind)会被 GCed 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645699/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com