【问题标题】:What kind of an impact do stateless objects with a ton of functions have on memory?具有大量功能的无状态对象对内存有什么样的影响?
【发布时间】:2017-04-19 10:00:10
【问题描述】:

假设我有一个名为Foo 的类。该类没有自己的状态,但有大量的功能。

class Foo
{
  public void One()
  {
    // 500 lines of code
    var bigObject = new BigBigBigObject();

    // do something to the big object

    // launch long-running operation

    // do some COM interop
  }

  public Result Two()
  {
    // 2800 lines
    using(var disposable = new SomeCustomDisposable())
    {
      ...
    }
  }

  public async Task<Bar> FourteenHundredAndFifty()
  {
    ...
  }
}

在 main 方法中,我们有一个对 Foo 的引用,如下所示:

public class Program
{
  public static void Main(string[] args)
  {
    var foo = new Foo();

    // run the program for a long time
    // calling functions on Foo

    ....
  }
}

我的问题是:即使对Foo 的引用在程序的整个生命周期中都保持活动状态,因为Foo 没有自己的状态,它对应用程序的内存占用有什么影响?

我假设由于它没有状态,它在 GC 堆上的大小仍然是 12 字节(在 32 位机器上和 64 位机器上 24 字节)。

但是:

  1. 它可能在加载器堆上占用了大量字节,因为它有很多方法,因此它们的方法定义将占用大量内存。

  2. 即使它没有自己的状态,但当调用它的一个或多个函数时,它们会将大对象留在大对象堆上。即便如此,这些方法对 GC 堆做了什么,它们是否会长时间留下大对象以及它们是否导致过多的分配或 GC 都取决于这些函数中的代码。 Foo 的大小仍然很小,并且在整个程序中保持对Foo 的引用对 GC 堆没有影响。

我的假设正确吗?

【问题讨论】:

  • 拿内存分析器看看,不要猜。

标签: c# .net memory garbage-collection


【解决方案1】:

如果这是您的担忧,您的课程不会因添加方法而在内存中变大。只有字段和属性会增加类的内存大小。内存中的类实例包含一个指向更大公共结构的指针,该结构包含方法指针和类元数据。

假设 x86 和 x64 的最小类大小分别为 12 和 24 字节是正确的。 See this post for more details.

【讨论】:

  • 谢谢。我知道 .NET 对象的结构。感谢您的确认和有用的链接。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多