不久前,我用C#编写了一个简单的完整TCP connect扫描器,并将其编译成动态链接库。它将PSObjects输出到管道以显示扫描结果。如果我正在扫描CIDR /16子网,根据任务管理器,我得到的数据量很好地进入了512MiB。一旦我分析完结果,我想找到一种方法来释放内存使用,以便为其他任务释放空间(我们必须使用少于8 GiB的内存...)。问题是我不能让PowerShell释放它对这个内存的占用。有谁知道释放这种内存消耗的好方法吗?
我尝试将变量设置为$null,删除变量,并调用GC::Collect(),但任务管理器中的内存使用量仍然保持在相同(或更高)的水平。我对这个看似简单的任务束手无策。也许内存被释放了,但任务管理器只报告之前的分配?
发布于 2014-04-15 02:05:38
托管内存的唯一释放将由CLR垃圾回收器完成。既然您已经尝试过GC收集,我会说您有一个托管的内存储备。也就是说,您还没有找到引用您的对象的所有根。我建议您使用诸如RedGate的内存分析器或免费的ClrProfiler之类的工具来确定哪些对象仍在引用您创建的对象。我相信即使是Visual Studio 2013也能够从转储文件中分析托管内存。这也可以帮助您找到包含对数据对象的引用的所有对象。顺便说一句,你的对象有没有包装本机资源(句柄,内存等)?
https://stackoverflow.com/questions/23073339
复制