C# 具有大量函数的无状态对象对内存有什么影响?

C# 具有大量函数的无状态对象对内存有什么影响?,c#,.net,memory,garbage-collection,C#,.net,Memory,Garbage Collection,假设我有一个名为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 } pub

假设我有一个名为
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()
  {
    ...
  }
}
我的问题是:尽管对
Foo
的引用在程序的整个生命周期中保持活动状态,但由于
Foo
本身没有状态,它对应用程序的内存占用有什么影响

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

然而:

  • 因为它有许多方法,所以它们的方法定义将占用相当大的内存,所以它可能在加载程序堆上占用大量字节

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


  • 我的假设正确吗?

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


    假设x86和x64的最小类大小分别为12和24字节是正确的

    带上内存分析器看看,不要猜。谢谢。我知道.NET对象的结构。感谢您的确认和有用的链接。:-)
    public class Program
    {
      public static void Main(string[] args)
      {
        var foo = new Foo();
    
        // run the program for a long time
        // calling functions on Foo
    
        ....
      }
    }