.NET中运行时对象的内存占用量是多少?

时间:2008-10-21 20:29:59

标签: c# .net-3.5

我在运行时有一个静态对象,它基本上是其他对象的列表(整数,字符串,字典,其他对象等)。有没有办法在运行时确定我的静态“其他对象列表”对象使用的内存?这对于仪器和报告来说非常方便。

5 个答案:

答案 0 :(得分: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 :(得分:2)

你可能会要求你可以从你的代码中调用一些东西(我也想知道),但我觉得我应该提一下Ants profiler [http://www.red-gate.com/Products/ants_profiler/index.htm]以防其他人没有找到具体的东西。它将在执行时告诉您有关代码的各种信息,包括正在使用的内存量。

来自他们的网站......

  

配置内存,了解你的情况   应用程序使用内存,并进行定位   内存泄漏。内存分析器   允许您在任何地方拍摄快照   指出你的执行   程序,所以你可以看到什么是内存   在那时使用。你可以采取   不同时间的多个快照   当你的应用程序运行时,所以   你可以比较应用程序内存   的状态。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

不是没有分析器。对于单个课程来说这很难 - 请参阅here

答案 4 :(得分:0)

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

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

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