【发布时间】: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 字节)。
但是:
它可能在加载器堆上占用了大量字节,因为它有很多方法,因此它们的方法定义将占用大量内存。
即使它没有自己的状态,但当调用它的一个或多个函数时,它们会将大对象留在大对象堆上。即便如此,这些方法对 GC 堆做了什么,它们是否会长时间留下大对象以及它们是否导致过多的分配或 GC 都取决于这些函数中的代码。
Foo的大小仍然很小,并且在整个程序中保持对Foo的引用对 GC 堆没有影响。
我的假设正确吗?
【问题讨论】:
-
拿内存分析器看看,不要猜。
标签: c# .net memory garbage-collection