2008-10-21 48 views
6

我在运行时有一个静态对象,基本上是其他对象(整数,字符串,字典,其他对象等)的列表。有没有办法在运行时确定我的静态“其他对象列表”对象所使用的内存?这对于仪器和报告目的会很方便。.NET运行时对象的内存占用情况如何?

回答

2

你可能会问的东西,你可以从你的代码(这是我想太多知道)打电话,但我觉得我应该提到蚂蚁的情况下,别人探查[http://www.red-gate.com/Products/ants_profiler/index.htm]是不是在找具体的东西。它会告诉你关于你的代码的所有信息,包括正在使用多少内存。

从他们的网站...

档案存储,了解您 应用程序如何使用内存,并找到 内存泄漏。该内存分析器 可以让你在你的 程序的执行任何 点拍摄快照,所以你可以看到什么样的内存是在这一点上使用 。您可以在不同时间拍摄 多个快照 而您的应用程序正在运行,所以 您可以比较应用程序内存 的状态。

+0

我确实在寻找一个编程实现。但我同意蚂蚁探查器可以在正确的情况下得心应手:) – Bullines 2008-10-21 20:38:55

3

的sizeof可以在值类型中使用也有Marshal.SizeOf可与一些提示用于.NET:

http://www.pixelicious.net/2008/07/03/exception-trying-to-get-the-size-of-a-c-class-using-marshalsizeof

不过...。那是不完全的总因为运行时确实为同步块等事物分配了额外的字节。

如果你在衡量这种类型的东西很感兴趣,但是,你应该使用分析API:

http://msdn.microsoft.com/en-us/library/ms404386.aspx

或者像的WinDbg,可以做各种美妙的事情一个免费的工具。

1

不是没有探查器。仅仅为了一个班而已经很难 - 参见here

2

尝试SOS调试库。这是最好的。 文章herehere

0

感谢您的回复。我认为我最初的攻击计划,因为我相信大多数对象都是可序列化的,将会是这样的:

using (MemoryStream memstream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    try 
    { 
     formatter.Serialize(memstream, myObjectOfObjects); 
     mem_footprint += memstream.Length; 
    } 
    catch 
    { 
     // not a serializable object 
    } 
} 
相关问题