【发布时间】:2014-12-11 04:33:46
【问题描述】:
我正在调查一个通过 FsiAnyCpu 运行的 F# 脚本,该脚本占用了大量内存。我使用 PerfView 拍摄了一个堆快照,看起来大多数高计数节点都植根于FSharp.Compiler!Microsoft.FSharp.Compiler.Ilxgen+IlxAssemblyGenerator。在拍摄快照之前,我强制 GC 并在此期间冻结进程。
默认独占视图显示:
这是意料之中的事吗?
【问题讨论】:
我正在调查一个通过 FsiAnyCpu 运行的 F# 脚本,该脚本占用了大量内存。我使用 PerfView 拍摄了一个堆快照,看起来大多数高计数节点都植根于FSharp.Compiler!Microsoft.FSharp.Compiler.Ilxgen+IlxAssemblyGenerator。在拍摄快照之前,我强制 GC 并在此期间冻结进程。
默认独占视图显示:
这是意料之中的事吗?
【问题讨论】:
FSI 生成程序集以包含您评估的代码。该代码可以保存对堆对象的根引用。您评估的表达式也可能导致根引用。 FSI 很可能表现为设计使然的内存泄漏——如果 REPL 不记得您之前评估过的内容,它可能就没那么有用了。出于同样的原因,它还可以保存对文件和程序集的打开引用。
在 Visual Studio 中,FSI 提供了一个名为“重置交互式会话”的上下文菜单命令,可以清除所有内容。对于命令行 FSI,您大概可以终止它。
【讨论】: