1

这个 msdn 页面上,它说

在堆上分配的对象越少,垃圾收集器要做的工作就越少。分配对象时,不要使用超出需要的四舍五入值,例如只需要 15 个字节时分配 32 个字节的数组。

有谁知道为什么这个建议在这里(除了显而易见的 - 我怀疑他们为什么在这里有这个)?

分配四舍五入到单词边界的空间有什么害处?

它对性能有影响吗?

4

2 回答 2

4

在复杂的堆管理器可用之前,在过去的非托管代码时代,四舍五入是一种策略。它减少了堆碎片的不良影响,堆中有一堆无法组合成更大的小空块。从而使程序以 OOM 终止,并带有大量未使用的内存。今天没有任何意义,Windows 低碎片堆解决了这个问题,尽管它也对分配进行了四舍五入。对于小型分配,最多为 8 的倍数。从 XP 开始可用,Vista 及更高版本默认开启。

当你有一个可以压缩并消除漏洞的垃圾收集器时,它就没有意义了。你只是给它更多的工作,移动未使用的内存,没有任何好处。

堆碎片在托管代码中并不是一个完全解决的问题,大对象堆最终可能会出现难以重用的空洞。LOH 没有被压缩,太多的数据无法移动。对大于 80 KB 的对象进行四舍五入实际上仍然有意义。只有当内存分析器显示您遇到 LOH 问题时,您才会这样做。此时您应该首先考虑迁移到 64 位操作系统。

于 2013-02-04T17:00:49.200 回答
1

分配四舍五入到单词边界的空间有什么害处?

坏处是你可以创建比需要更多的对象,这会导致更大的 GC 压力。这正是指南所说的。没有任何关于它作为单词边界的具体内容 - 它更多的是分配比需要更多的内存的问题。

它对性能有影响吗?

是的,它会对性能产生负面影响,因为它会导致 GC 需要更加努力地工作。

于 2013-02-04T16:48:13.093 回答