我正在研究通过FsiAnyCpu运行的F#脚本,该脚本使用了大量内存。我使用PerfView获取了一个堆快照,看起来大多数高计数节点都植根于FSharp.Compiler!Microsoft.FSharp.Compiler.Ilxgen+IlxAssemblyGenerator
。拍摄快照之前,我强制使用GC并冻结整个过程。
默认独占视图显示:
这是预期的吗?
答案 0 :(得分:3)
FSI生成程序集以包含您评估的代码。该代码可以保存对堆对象的根对引用。您评估的表达式也可能导致root权限引用。 FSI可能表现为设计内存泄漏 - 如果REPL不记得您之前评估过的内容,那么它可能就不那么有用了。出于同样的原因,它还可以保存对文件和程序集的开放引用。
在Visual Studio中,FSI提供了一个名为“重置交互式会话”的上下文菜单命令,可以清除所有内容。对于命令行FSI,大概你可以终止它。