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

Memory leaks 在大对象堆上分配200mb对象时,32位.net应用程序内存不足,memory-leaks,out-of-memory,clr,windbg,memory-fragmentation,Memory Leaks,Out Of Memory,Clr,Windbg,Memory Fragmentation,我有一个在.NET4.7上运行32位的应用程序。当应用程序启动时,它从服务器加载一组数据并将其缓存在内存中 在某个时间点,应用程序从服务器接收200mb缓冲列表,并尝试分配字节[],导致内存不足异常 在异常发生之前使用转储启动Windbg,我看到以下内容: 我注意到: MEM_FREE是621mb和 一块内存中只有114mb可用 如果我理解正确的话,这意味着操作系统愿意给我们更多的内存,但堆太分散,无法在一个地方分配所有内存 当我获得托管堆时!eeheap-gc我得到: 与GC堆之间的差

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

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

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

我注意到:

  • MEM_FREE是621mb和
  • 一块内存中只有114mb可用
如果我理解正确的话,这意味着操作系统愿意给我们更多的内存,但堆太分散,无法在一个地方分配所有内存

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

与GC堆之间的差异约为270mb。我不认为这是本案中出现错误的原因

查看GC生成,我得到:

  • GEN0:1990对象,0.5mb
  • 第1代:307个对象,0.8mb
  • GEN2:?对象,600mb
  • GEN3:105个对象,172mb
处理程序看起来不重要,自由对象也不重要:

根据以上信息,我不确定我是否理解操作系统为什么不将500mb分配给LOH。看起来GEN2是最大的,但是不应该压缩吗?我可以从这里到哪里获得更多关于这个问题的信息