2

我正在调查一个通过 FsiAnyCpu 运行的 F# 脚本,该脚本使用了大量内存。我使用 PerfView 拍摄了一个堆快照,看起来大多数高计数节点都植根于FSharp.Compiler!Microsoft.FSharp.Compiler.Ilxgen+IlxAssemblyGenerator. 在拍摄快照之前,我强制执行 GC 并在此期间冻结进程。

默认独占视图显示:

在此处输入图像描述

这是可以预料的吗?

4

1 回答 1

3

FSI 生成程序集以包含您评估的代码。该代码可以保存对堆对象的根引用。您评估的表达式也可能导致根引用。FSI 很可能表现为设计使然的内存泄漏——如果 REPL 不记得您之前评估过的内容,它可能就没那么有用了。出于同样的原因,它还可以保存对文件和程序集的打开引用。

在 Visual Studio FSI 中,提供了一个名为“重置交互式会话”的上下文菜单命令,可以清理所有内容。对于命令行 FSI,您大概可以终止它。

于 2014-12-10T20:25:15.450 回答