【问题标题】:CLR: What is the lifetime of const string values in memory?CLR:const 字符串值在内存中的生命周期是多少?
【发布时间】:2010-07-21 11:37:34
【问题描述】:

假设我们有一个包含 10000 个 const 字符串成员的类。

class Schema
{
  //Average string length is 20
  public const string ID1 = "some.constant.value";
  public const string ID2 = "some.other.constant.value";
  //...
}

并非所有字段都在其余代码中被引用。其中只有 10% 在启动时被访问——它们的引用被分配为各种字典(数千个 Dictionary 实例)的键。我知道 const 字符串是实习的 - 多次引用 const 字符串不会增加消耗的内存超过指向实习字符串表中偏移量的元数据令牌的大小。

我了解 const 字符串被编译到程序集中,因此会影响已编译程序集的大小。


这些 const 字符串在什么确切时间/事件消耗运行时内存?

将是 all 加载程序集时占用的 const 字符串所需的所有内存,还是延迟到类被 JIT 编译?

我们可以通过改变等式中的某些内容来减少启动后的内存消耗吗? (将字段设为非 const,将字符串设为静态字段?)。

让我们假设一个 Winforms 应用程序 (.NET 2.0)。

【问题讨论】:

  • 粗略估计,总内存消耗量约为 300 kB,大约是现代计算机 RAM (4 GB) 的 0.0075%。这有多重要?
  • 忘记数字,内存使用优化不是这里的目标。问这个问题主要是为了理解原理。
  • @Marcelo:RAM 与它有什么关系? RAM是一种性能优化;稀缺资源不是 RAM,而是虚拟地址空间。当您“内存不足”时,您已经用完了地址空间,而不是 RAM;如果您的 RAM 用完了,那么操作系统只会转到磁盘并对其进行分页。现在已经不是 1980 年了。我们有虚拟内存。 :-)
  • 如果您想了解 .NET 中的内存消耗情况,我建议您在内存分析器下运行一些应用程序,并检查其输出。您可以了解很多关于您的应用程序中正在发生的事情。至于何时创建字符串常量:我根本不会担心。这是一个实现细节,所涉及的总内存通常很小。
  • @Eric:同样的论点适用于 RAM 作为性能优化。正如我们应该担心如何使用 L1/L2/L3 缓存一样,我们也应该担心我们对物理 RAM 的使用。当然,如果这些常量中的大多数从未被触及,它们只会消耗地址空间,但如果它们被持续使用,那么它们也会消耗物理 RAM 并增加分页系统的压力。简而言之,RAM 和地址空间都是重要的考虑因素,即使在 2010 年也是如此。

标签: c# string memory-management clr constants


【解决方案1】:

Const 字符串是编译时文字,由于 CLR 对这些使用实习,只要应用程序处于活动状态,它们就会一直存在。

您也可以找到我对this question 的相关回答。

【讨论】:

    【解决方案2】:

    我可能错了,但是当第一次引用程序集时,它完全加载到内存中 包含所有代码、元数据和常量值(我不确定嵌入式资源是否也被加载或延迟)。它会一直加载直到进程终止

    【讨论】:

    • @Henk 我明白了。但问题是它按需加载什么。整个程序集(我的看法)还是只是其中的一部分?
    【解决方案3】:

    字符串是常量并不重要。常量本身根本不占用任何内存,占用内存的是文字字符串。

    当您在代码中使用常量时,编译器会将其替换为对文字字符串的引用。

    字符串文字随程序集一起加载,因此它们会在应用程序的整个生命周期中一直存在。即使您将常量更改为其他内容,字符串文字仍然存在。使用变量而不是常量实际上会使用更多内存,因为它需要在某个地方存储变量的值(即对文字字符串的引用的副本)。

    【讨论】:

    • 所以你的意思是,如果我不使用代码中的任何常量,它们就不会占用内存?
    • @Marek:文字字符串仍然会占用内存,编译器无法优化它们。常量(即对文字字符串的引用)是在编译时使用的声明,它们从不占用任何内存。
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 2013-01-28
    • 1970-01-01
    • 2023-03-16
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多