微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在大型对象堆上分配200mb对象时,32位.net应用程序的内存不足

如何解决在大型对象堆上分配200mb对象时,32位.net应用程序的内存不足

我有一个在.net 4.7上运行32位的应用程序。当应用程序启动时,它将从服务器加载一堆数据并将其缓存在内存中。

在某个时间点,应用程序从服务器接收到200mb的缓冲列表,并尝试分配一个byte [],从而导致内存不足异常。

在异常发生之前通过转储启动Windbg,我看到以下内容

enter image description here

我注意到:

  • MEM_FREE是621mb,并且
  • 一个内存块中只有114mb可用。

如果我对它的理解正确,那就意味着OS愿意为我们提供更多的内存,但是如果堆太零碎了,就无法在一个地方分配所有内存。

当我使用!eeheap -gc获得托管堆时,我得到:

enter image description here

和GC堆之间的区别是〜270mb。在这种情况下,我认为这不是错误的原因。

看看GC世代,我得到:

  • GEN0:1990个对象,0.5mb
  • GEN1:307个对象,0.8mb
  • GEN2 :?对象,600mb
  • GEN3:105个对象,172mb

处理程序看起来并不相关,自由对象也不相关:

enter image description here

enter image description here

使用以上信息,我不确定我为什么操作系统不将500mb分配给LOH。看起来GEN2是最大的,但是不应该压缩它吗?我可以从哪里获得有关此问题的更多信息?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。