VirtualandPhysicalMemory/OutOfMemoryException我正在开发一个64位的.NetWindows服务应用程序,它实际上加载了一堆数据进行处理。在执行数据量测试时,我们能够使进程不堪重负并抛出OutOfMemoryException(当进程失败时,我没有关于该进程的任何性能统计信息。)我很难相信该进程正在请求一块内存,因为在64位机器上运行以来,已经超出了该进程允许的地址空间。我知道该进程在一台物理内存使用率大约为80%-90%的机器上运行。我的问题是:如果机器的可用物理内存严重不足,即使进程不会超过其允许的虚拟内存量,CLR是否会抛出OutOfMemoryException?感谢您的帮助!在64位环境中仍然存在一些可达到的限制。查看此页面以了解一些最常见的问题。简而言之,是的,如果您的程序将多达128GB的??数据加载到虚拟内存中,您仍然可能会耗尽内存。如果您没有设置IMAGE_FILE_LARGE_ADDRESS_AWARE环境变量,您可能仍会受到每个进程2GB的最大限制。另一种可能性是该程序正在尝试分配大于2GB的内存块,这是.NET的限制。当事物被添加到集合(通常是Dictionary或HashSet,但也包括List或任何其他自动增长的集合)时会发生这种情况。如果您试图将超过4700万个项目放入一个集合中,Dictionary和HashSet通常会这样做。虽然集合可以容纳大约8950万,但增加集合的算法是通过加倍来实现的。如果您从一个空的字典开始并开始添加项目,则该集合会翻倍,直到达到大约4700万。然后它再次尝试加倍并抛出OutOfMemoryException。避免异常的方法是预先分配集合,使其容量足够大,可以容纳您希望放入其中的所有项目。理论上你可以解决这个问题。这就是您所拥有的物理特性,当您超过交换开始时,这通常仅限于某些选定磁盘分区的大小。根据经验,人们倾向于权衡少量(例如一两个)物理内存的倍数。所以是的,很可能你没有可用的、不可寻址的内存。以上就是C#学习教程:VirtualandPhysicalMemory/OutOfMemoryException分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
