在阅读提高 .NET 应用程序性能和可扩展性时,我在“提高托管代码性能/垃圾收集器指南:
Avoid preallocating and chunking memory.
但是这本书从来没有解释过为什么预分配是不好的,或者根据 GC 优化,分块的真正含义是什么。
有人可以更深入地了解这个问题并向我解释为什么 2 不好,以及它们在 .net 中使用 GC 的真正含义是什么?
在阅读提高 .NET 应用程序性能和可扩展性时,我在“提高托管代码性能/垃圾收集器指南:
Avoid preallocating and chunking memory.
但是这本书从来没有解释过为什么预分配是不好的,或者根据 GC 优化,分块的真正含义是什么。
有人可以更深入地了解这个问题并向我解释为什么 2 不好,以及它们在 .net 中使用 GC 的真正含义是什么?
预分配内存是一种不能很好扩展的技术。分块可能会推动大对象堆中的分配。要么会让你不必要地使用内存。相信垃圾收集器,在需要时分配。
关于问题所在,它确实有一些话要说。第 198 页:
C++ 程序员经常分配一大块内存(使用 malloc),然后一次使用块,以保存对 malloc 的多次调用。出于以下几个原因,这对于托管代码是不可取的:
- 托管内存的分配是一种快速操作,垃圾收集器已针对极快的分配进行了优化。在非托管代码中预分配内存的主要原因是为了加快分配过程。这不是托管代码的问题。
- 如果你预先分配内存,你会导致比需要更多的分配;这可能会触发不必要的垃圾收集。
- 垃圾收集器无法回收您手动回收的内存。
- 预分配的内存在最终释放时会老化并且回收成本更高。