【问题标题】:Why this MSDN guidance?为什么这个 MSDN 指南?
【发布时间】:2013-02-04 16:45:28
【问题描述】:

this msdn page,上面写着

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

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

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

对性能有影响吗?

【问题讨论】:

  • 因为它没有给你任何东西,而且根据对象头和数组头的布局,这可能意味着你要分配太多。

标签: .net memory-management garbage-collection


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    对性能有影响吗?

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

    【讨论】:

    • 恕我直言,在这个框架时代 - 包括 Microsoft Forms 或 WPF - 成千上万的对象被不断创建和烧毁,我认为将对象分配到堆上最近的单词边界几乎不会影响性能或 GC 影响。
    • @U1199880 这完全取决于 where 以及如何使用它。有时性能确实很重要,尽管这种情况很少见。如果这恰好发生在被测量为有问题的部分(即:后分析)的代码部分中,并且在非常紧密的循环中运行很多次,它可能会产生影响。 (不过,我在这方面有偏见,因为我在经常发生这种情况的软件上工作 - 我同意这对于典型的 LOB 应用程序可能根本不重要)
    • 你是对的 - 我不知道为什么我什至觉得有必要注入我的意见,因为答案在技术上是正确的。
    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多