OCaml 垃圾收集中间结果吗?
Does OCaml garbage collect intermediate results?
假设我有一个函数
let rec f x =
let a = (* build a huge list, possibly used f on smaller input again here *) in
let b = (* build a huge list, possibly used f on smaller input again too *) in
List.append a b
我的问题是调用 f
后 a
和 b
被释放了吗?我的程序占用了我的内存,我怀疑这是否是原因。
是的,它将被释放。 OCaml 垃圾收集通常不会泄漏,如果值不可达,它将被收集。如果可以重用内存,它将被重用。
请注意,如果您使用的是非常大的数据结构,那么列表可能不是一个好的选择,尤其是用 concat
连接列表效率非常低。
f
returns其值后,变量a
和b
无法访问。所以 a
的值最终会被垃圾回收。对于 List.append
最明显的实现,b
的值构成函数结果的一部分。因此,在无法再访问此结果之前,不会对其进行垃圾回收。
如果您有内存泄漏,您需要查看整个计算都可以访问的地方。一个例子是一个大的全局 table.
假设我有一个函数
let rec f x =
let a = (* build a huge list, possibly used f on smaller input again here *) in
let b = (* build a huge list, possibly used f on smaller input again too *) in
List.append a b
我的问题是调用 f
后 a
和 b
被释放了吗?我的程序占用了我的内存,我怀疑这是否是原因。
是的,它将被释放。 OCaml 垃圾收集通常不会泄漏,如果值不可达,它将被收集。如果可以重用内存,它将被重用。
请注意,如果您使用的是非常大的数据结构,那么列表可能不是一个好的选择,尤其是用 concat
连接列表效率非常低。
f
returns其值后,变量a
和b
无法访问。所以 a
的值最终会被垃圾回收。对于 List.append
最明显的实现,b
的值构成函数结果的一部分。因此,在无法再访问此结果之前,不会对其进行垃圾回收。
如果您有内存泄漏,您需要查看整个计算都可以访问的地方。一个例子是一个大的全局 table.