【发布时间】:2011-12-11 06:42:39
【问题描述】:
我有一个用 C# 编写的应用程序运行良好,但偶尔会在现场出现错误,我们认为这是由于内存不足或与垃圾收集器交互造成的。
如果有人有兴趣,在这里描述:
Unable to cast object of type 'NHibernate.Impl.ExpandedQueryExpression' to type 'NHibernate.Linq.NhLinqExpression'
我想尝试重现这个以进行调试,但是我的开发机器内存太多。
我已删除页面文件,因此我的虚拟内存仅限于 12GB 的物理内存,因此除了物理删除 ram 之外,是否有人对如何在开发环境中模拟低内存条件有任何建议?
编辑:
删除了关于监控垃圾收集器的工具的询问?
【问题讨论】:
-
您似乎认为您的机器拥有硬件内存与进程拥有虚拟内存有关。 几十年来并非如此。请记住,物理内存和虚拟内存地址空间几乎没有任何关系。无论您拥有多少物理内存,该进程都会获得相同数量的虚拟内存;更多的物理内存只会使使用虚拟内存更快。 您想模拟虚拟内存地址空间不足还是物理内存不足?
-
是的,有 很多 工具可以监控垃圾收集器。给自己找一个内存分析器,或者观察性能计数器。
-
@Eric,你是对的,我应该更清楚。在尝试调试时,我删除了页面文件,因此我的虚拟内存被限制为 12GB 的物理内存。
-
究竟是什么原因让您相信内存不足会导致无效的强制转换异常?我发现像这样的随机问题可能更多地归因于线程安全问题,在这种特殊情况下,NHibernate 库中的某些代码可能无法在高负载情况下表现良好。我当然不会得出这样的结论,即可用的虚拟地址空间甚至机器的物理 RAM 量与无效转换异常有任何关系。
-
我注意到现在你仍然可能没有模拟你想要模拟的东西;请记住,没有能力将虚拟内存提交到存储,因为没有存储,即使有足够的地址空间和没有能力提交虚拟内存到存储因为没有地址空间可以映射它。 但更重要的问题是:为什么您认为您的问题与内存不足有任何关系?为什么一个无效的强制转换异常会让你相信这是一个内存问题,而不是类型错误?
标签: c# memory-management windows-7 garbage-collection