Visual Studio 监视窗口查看对象的大小/内存占用

Posted

技术标签:

【中文标题】Visual Studio 监视窗口查看对象的大小/内存占用【英文标题】:Visual Studio watch window see object's size/memory footprint 【发布时间】:2012-02-23 15:59:45 【问题描述】:

不确定这是否可能,但我很好奇,到目前为止我还没有找到任何运气。我想知道是否有人知道从 VS 监视窗口中确定内存中对象大小的方法。显然,分析器可以做到这一点,但从 VS 中快速获取快照会非常方便。这可能吗?

【问题讨论】:

Visual Studio 内置了一个分析器,但我不知道如何在不编写自定义内容的情况下在监视窗口中执行此操作。 你定义的对象的大小是多少?将使用 BinarySerializer 的对象写入流时获得的大小相同?这意味着对象本身以及它所引用的所有对象。 确切地说,对象的大小以及它引用的所有对象。 有什么理由需要知道尺寸吗?在 .NET 中找到对象的“确切”大小是非常棘手的——尤其是复杂的。我一直在 WinDbg 中工作,以了解 ASP.NET 应用程序中应用程序和会话缓存数据的大小 - 并且发现这很难做到。我还使用不安全代码、指针和内存映射文件从 .NET 进行直接内存存储/访问 - 并且发现存储和处理复杂对象非常棘手。 真的没有什么主要原因,只是想知道是否有可能作为一种方法来处理给定对象的大小(即特定实例或对象的实例往往有多大)。 【参考方案1】:

不确定这是否会帮助其他人解决这个问题。

在 VS2015 中,您可以在断点处停止并使用Diagnostic Tools 窗口。

    菜单 调试 窗户 显示诊断工具 点击Take Snapshot 等待创建快照。 点击ObjectsHeap Size 列中的蓝色超链接 查看变量的包含大小。

HTH。

【讨论】:

我将添加非常大的解决方案,这可能会在 Visual Studio 中引发内存不足异常 我想添加来自 MS 的此工具的链接:docs.microsoft.com/en-us/visualstudio/profiling/…【参考方案2】:

我认为这是不可能的。请参阅Size of a managed object(相当旧但似乎仍然有效)。

您可以在“立即”窗口中设置对象大小。在Find out the size of a .net object 中查看我的答案。

您可以在您的代码中编写一个函数(改编自上述线程)并从 watch 中引用它。

Public Function GetSerializedSize(myObject As Object) As Long
    Using ms As New IO.MemoryStream
        Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        bf.Serialize(ms, myObject)
        GetSerializedSize = ms.Position
    End Using
End Function

但是,这既不精确(我得到的 DatataTable 值小 2 倍)也不方便(必须手动刷新该值),但它为您提供了一些线索。

【讨论】:

【参考方案3】:
    创建对象列表。 只添加一个对象(对于字符串属性添加最大字符串长度)。 在添加对象之前设置断点。 运行项目 拍摄“内存使用情况快照”(标签:诊断工具下的内存使用情况)。 获取另一个快照。

这并不准确,但它是一个很好的猜测。

【讨论】:

以上是关于Visual Studio 监视窗口查看对象的大小/内存占用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Visual Studio 调试器的 Watch 窗口查看内存位置的值?

在 Visual Studio 监视窗口中显示包含特殊字符的数组范围。

浅谈如何使用visual studio监视窗口

有没有办法在我自己的应用程序中使用 Visual Studio 的监视窗口?

“类型或命名空间名称‘[Type]’在此范围内无效”Visual Studio 监视窗口中的错误?

从 Visual Studio 的监视窗口访问 javascript?