在阅读提高.NET应用程序性能和可伸缩性时,我在“改进托管代码性能/垃圾收集器指南”中遇到了这个问题:
Avoid preallocating and chunking memory.
但这本书从未解释过为什么预分配是坏的或者Chunking在GC优化方面的真正含义。
有人可以更清楚地了解这个问题,并向我解释为什么这两个是坏的,它们在使用.net的GC方面有什么意义?
答案 0 :(得分:7)
预分配内存是一种无法很好扩展的技术。分块可以推动大对象堆中的分配。要么会让你不必要地使用内存。信任垃圾收集器,在需要时进行分配。
答案 1 :(得分:3)
关于问题的确有几点要说。页面198:
C ++程序员经常分配一大块内存(使用malloc)然后 一次使用块,以保存对malloc的多个调用。这是不可取的 托管代码有几个原因:
- 管理内存的分配是一个快速操作,垃圾收集器具有 针对极快的分配进行了优化。预分配的主要原因 非托管代码中的内存是加快分配过程。这不是 托管代码的问题。
- 如果预先分配内存,则会导致分配超出需要;这个可以 触发不必要的垃圾收集
- 垃圾收集器无法回收您手动回收的内存。
- 预分配的内存时间和最终发布后的回收成本更高。