我试图解析某个数据文件。该文件大约3 MB,我希望它扩展的数据结构占用大约40 MB的内存。我已经使用解析器验证了这一点,该解析器产生了正确的结果,但非常慢。我尝试使用不同的,更快的解析器,但不知何故,当我运行解析器时,它最终耗费超过1.5 GB并且吹掉了32位地址空间,我得到了OutOfMemoryException
。
解析器是由解析器生成器生成的,它显然做了一些非常错误的事情。我有解析器生成器的源代码,但我不知道从哪里开始寻找修复它。
如果我知道所有记忆的来源,真正有用的是什么。如果我可以解析一个会生成几百MB垃圾的较小文件,那么运行GC并返回一个报告,例如"收集100万个X类实例,300万个Y类实例等等# 34;然后我会对要关注什么有一个好主意。
有没有办法做到这一点?
答案 0 :(得分:2)
您可以使用内存分析器来解决这些问题。它将向您展示哪些特定类占用最多的内存以及它们的创建位置。
某些版本的Visual Studio具有内置的分析器。还有几个商业版,例如Redgate ANTS Memory Profiler或来自Jetbrains的dotMemory。他们有试用版。
答案 1 :(得分:0)
您可以使用JetBrains中的dotMemory。如果从Profiler运行程序,则可以收集有关创建对象的堆栈的信息。当你采取shapshot它会帮助你找出什么方法吃大部分的内存。 而且你可以借助简单的树或冰柱图来调查它,它看起来像: