【问题标题】:F# Interactive Memory LeakF# 交互式内存泄漏
【发布时间】:2014-10-03 12:44:31
【问题描述】:

如果我打开 fsi 并粘贴以下内容:

[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;
[1..10000000];;

我明白了:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.

如果我以let x = 为前缀,也是一样。似乎顶级引用继续保留,无论它们多么难以访问。有什么方法可以清理这些东西,而不会失去能够逐步浏览数据的便利?现在我只是重新启动清理,但不方便。

【问题讨论】:

  • 有点迂腐,但这不是内存泄漏,它只是 fsi 的功能。
  • @mydogisbox 根据 Wikipedia 的说法,“当对象存储在内存中但运行代码无法访问时,可能会发生内存泄漏”。在这种情况下,“它的功能”是泄漏内存。
  • 好吧,如果你不是在 fsi.exe 中而是在你自己的可执行程序中执行相同的代码,它的行为也会相同。
  • [] 让 main argv = [1..100000000] [1..100000000] [1..100000000] [1..100000000] [1..100000000] [1. .100000000] [1..100000000] [1..100000000] [1..100000000] printfn "%A" argv 0 // 返回一个整数退出代码
  • 它的注释格式错误,但本质上它与主函数中的代码几乎相同

标签: f# f#-interactive


【解决方案1】:

我认为没有办法清除 FSI 中的顶级引用。您可以使用 F# 交互进程的 64-but 模式增加 FSI 可以寻址的内存量。 在 VisualStudio 中是“Tools-Options-F# Tools->F# Interactive”设置

【讨论】:

  • 实际上我使用的是 fsianycpu.exe,当它消耗 20GB 左右的 RAM 时,我必须重新启动。
  • 然后像@jyoung 建议的那样使用可变变量可能会成功
【解决方案2】:

既然您愿意使用let x = [1..10000000],那么请使用:

let mutable x = [1..10000000];; 

并重用数据内存使用:

x <- [1..10000000];;  

并释放数据内存使用:

x <- [];; 

【讨论】:

  • 太棒了!我需要做的就是System.GC.Collect();;,然后一切都消失了!如果我有耐心,它可能会自行消失。
  • 好的,比这要复杂得多。 “x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2010-12-12
  • 2018-03-04
  • 2011-11-06
  • 2011-08-05
相关资源
最近更新 更多