以编程方式查找对象使用的内存

2024-03-19

有没有办法以编程方式准确确定 C# 中对象使用的内存量?我不关心这个过程有多慢,所以左右运行 GC 是可以接受的(当然我更喜欢更高效的东西)。

  • 序列化对象并查看结果长度似乎不太准确(在对此方法的简单测试中,我看到整数返回值 54)。

  • Using GC.GetTotalMemory(true)似乎会产生不一致的值,更不用说它们看起来太大了。

  • Using Marshal.SizeOf(object)产生准确的结果,但似乎只适用于基元。

如果没有任何可用的方法,另一种方法是根据所使用的结构和所涉及的基元来计算大小。这也是可以接受的(尽管令人不安),但我需要知道计算对象开销的正确方法等。任何能向我展示一种方法的文献都会很棒。

类似的SO问题(似乎都没有准确计算对象大小的具体方法):

C#/.NET 对象使用多少内存? https://stackoverflow.com/questions/426396/how-much-memory-does-a-c-net-object-use

如何在 C# 中获取可用或已使用的内存 https://stackoverflow.com/questions/750574/how-to-get-memory-available-or-used-in-c-sharp

如何获取内存中对象的大小? https://stackoverflow.com/questions/605621/how-to-get-object-size-in-memory

sizeof() 相当于引用类型? https://stackoverflow.com/questions/26570/sizeof-equivalent-for-reference-types

分析内存的工具(非编程方法):

http://www.microsoft.com/en-us/download/details.aspx?id=16273 http://www.microsoft.com/en-us/download/details.aspx?id=16273

找出 C# 中的对象使用了多少内存? https://stackoverflow.com/questions/60820/find-out-how-much-memory-is-being-used-by-an-object-in-c


另一个想法是有一个辅助类来通过反映对象并提取其所有数据成员并通过 sizeof() 收集所有字段大小来完成此操作,这会有点复杂,但它是可以实现的

这个类将计算一个对象的实际大小,但我只测试了几次,并且测试了一些对象,但我想我会工作。

public class SizeHelper
{
    private static int GetTypeSizeArray(string typeName, object objValue)
    {
        switch (typeName)
        {
            case "System.Double[]":
                return sizeof(System.Double) * ((System.Double[]) objValue).Length ;
            case "System.Single[]":
                return sizeof(System.Single) * ((System.Single[])objValue).Length;
            case "System.Char[]":
                return sizeof(System.Char) * ((System.Char[])objValue).Length;
            case "System.Int16[]":
                return sizeof(System.Int16) * ((System.Int16[])objValue).Length;
            case "System.Int32[]":
                return sizeof(System.Int32) * ((System.Int32[])objValue).Length;
            case "System.Int64[]":
                return sizeof(System.Int64) * ((System.Int64[])objValue).Length;
            case "System.UInt16[]":
                return sizeof(System.UInt16) * ((System.UInt16[])objValue).Length;
            case "System.UInt32[]":
                return sizeof(System.UInt32) * ((System.UInt32[])objValue).Length;
            case "System.UInt64[]":
                return sizeof(System.UInt64) * ((System.UInt64[])objValue).Length;
            case "System.Decimal[]":
                return sizeof(System.Decimal) * ((System.Decimal[])objValue).Length;
            case "System.Byte[]":
                return sizeof(System.Byte) * ((System.Byte[])objValue).Length;
            case "System.SByte[]":
                return sizeof(System.SByte) * ((System.SByte[])objValue).Length;
            case "System.Boolean":
                return sizeof (System.Boolean)*((System.Boolean[]) objValue).Length;
            default:
                return 0;
        }
    }

    public static int GetSize(object obj)
    {
        Type t = obj.GetType();

        FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
        int size = 0;
        foreach (FieldInfo fieldInfo in fields)
        {
            if (fieldInfo.FieldType.BaseType.FullName.Equals("System.ValueType"))
            {
                size += GetTypeSize(fieldInfo.FieldType.FullName);
            }
            else if (fieldInfo.FieldType.BaseType.FullName.Equals("System.Array"))
            {
                var subObj = fieldInfo.GetValue(obj);
                if (subObj != null)
                    size += GetTypeSizeArray(fieldInfo.FieldType.FullName, subObj);
            }
            else if(fieldInfo.FieldType.FullName.Equals("System.String"))
            {
                var subObj = fieldInfo.GetValue(obj);
                if (subObj != null)
                {
                    size += subObj.ToString().Length*sizeof (System.Char);
                }
            }
            else
            {
                var subObj = fieldInfo.GetValue(obj);
                if (subObj != null)
                    size += GetSize(subObj);
            }
        }
        return size;
    }

    private static int GetTypeSize(string typeName)
    {
        switch (typeName)
        {
            case "System.Double":
                return sizeof(System.Double);
            case "System.Single":
                return sizeof(System.Single);
            case "System.Char":
                return sizeof(System.Char);
            case "System.Int16":
                return sizeof(System.Int16);
            case "System.Int32":
                return sizeof(System.Int32);
            case "System.Int64":
                return sizeof(System.Int64);
            case "System.UInt16":
                return sizeof(System.UInt16);
            case "System.UInt32":
                return sizeof(System.UInt32);
            case "System.UInt64":
                return sizeof(System.UInt64);
            case "System.Decimal":
                return sizeof(System.Decimal);
            case "System.Byte":
                return sizeof(System.Byte);
            case "System.SByte":
                return sizeof(System.SByte);
             case "System.Boolean":
                return sizeof (System.Boolean);
            default:
                return 0;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式查找对象使用的内存 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 阿帕奇“找不到文件。”而不是 404. 错误文档

    我想设置自定义 404 错误文档 但我遇到了问题 首先 我的 htaccess 中有两个 RewriteRules RewriteRule 2 3 php lang 1 L RewriteRule 2 3 4 php lang 1 L 所以
  • 在新的 Android Studio 项目上获取“错误:无法在 null 对象上获取属性 ':lib'”

    我已经使用 Android Studio 创建了一个新项目 并在其中添加了新的 lib 项目 但现在我得到了 Error Cannot get property lib on null object 显然我设法通过添加逗号来解决它setti
  • Java 中 10,000 以内且 3、5 或 7 的倍数的数字之和

    我知道如何让程序将 3 5 和 7 中每一个的倍数总和相加 但我不确定如何让程序只使用每个数字一次 例如 我可以让程序找出所有数字并将它们相加为 3 然后对 5 执行相同操作 但数字 15 将出现在最终数字中两次 我不确定如何让它只接受一次
  • Spring 验证异常:BindException

    提交表格至addUser控制器发生异常 严重 Servlet DispatcherServlet 的 Servlet service 抛出异常 org springframework validation BindException org
  • 在 yq 中传递 bash 变量

    我正在尝试在 yq 中传递 bash 变量 test yml configuration Properties corporate url https stackoverflow com temp configuration Propert
  • beforeunload 中的 ajax 会可靠执行吗?

    我有一个 HTML5 应用程序 需要在用户更改 刷新页面时发送断开连接 ajax 请求 我目前正在使用这段代码 window addEventListener beforeunload function event ajax url api
  • 如何在asp.net core应用程序中运行ssis包?

    我已经使用 Microsoft SqlServer Dts Runtime 在 ASP NET MVC 中运行包 但是我需要在 asp net core 中运行它 由于我们无法在 ASP NET Core 中添加单独的 DLL 我想知道是否
  • Android 应用程序复制保护和数据文件

    在我的应用程序中 我在代码中的以下硬编码位置访问我的 sqlite 数据库 数据 数据 com mydomain appname databases database db 如果我在 Market Place 中打开复制保护 我的应用程序仍
  • Telegram 机器人:如何隐藏内联键盘? PHP

    我制作了一个带有内联键盘的电报机器人 来自InlineKeyboardMarkup 我喜欢hide 或使其one time 用户响应后的键盘 我怎样才能在 PHP 中做到这一点 这是我的机器人的视图 有方法editMessageReplyM
  • 在 Backbone.js 中使用状态并登录用户

    我需要检查用户是否已登录并经过身份验证 然后才能让我的用户使用我的backbone js基于应用程序 用户身份验证作为属性存储在本机主干模型中 我在启动主路由器之前通过调用进行检查Backbone history start 这样 未经身份
  • 使用 React 内联样式设置背景图像

    我正在尝试访问静态图像以在内联中使用backgroundImageReact 中的属性 不幸的是 我对如何做到这一点已经一无所知 一般来说 我认为你只是做了如下操作 import Background from images backgro
  • 扩展方法中的 ArgumentNullException 或 NullReferenceException?

    在空实例上调用扩展方法 扩展方法不允许 时 您认为抛出的最佳异常类型是什么 由于扩展方法只不过是静态方法 您可能会认为它应该是 ArgumentNullException 但另一方面 它们的使用方式与实例方法类似 因此使用 NullRefe
  • 检测主线程之外的 UI 操作

    注 此问题涉及从后台线程调用 UIKit 时发出警告 https stackoverflow com questions 10976424 warn on calls to uikit from background threads但没有给
  • 如何将进度条连接到函数?

    我正在尝试将进度条连接到我的项目的函数 这是我到目前为止所拥有的 但我很确定它什么也没做 def main pgBar start function1 function2 function3 function4 pgBar stop 这是我
  • Postgresql - 在大数据库中使用数组的性能

    假设我们有一个包含 600 万条记录的表 有 16 个整数列和少量文本列 它是只读表 因此每个整数列都有一个索引 每条记录大约 50 60 字节 表名称为 项目 服务器为 12 GB RAM 1 5 TB SATA 4 核 所有 postg
  • 如何在[关闭]下实现带点的画廊滑动

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现画廊下点滑动 我需要显示当前
  • HTML 内容提取的最新技术水平如何?

    有很多关于 HTML 内容提取的学术工作 例如 Gupta Kaiser 2005 从可访问的网页中提取内容 http citeseerx ist psu edu viewdoc summary doi 10 1 1 60 357 以及这里
  • 链接到 CMAKE 中的ExternalProject_add 依赖项

    我在运行 Ninja 时收到以下 ninja 构建错误 我的 CMAKE 构建命令是cmake G Ninja DCMAKE BUILD TYPE Release ninja error ext deps api src ext api b
  • Angular2:表中带有 *ngFor 的复选框

    我有一个 HTML 表 其中每行都有一个关联的复选框 默认情况下 最初会检查所有行
  • 以编程方式查找对象使用的内存

    有没有办法以编程方式准确确定 C 中对象使用的内存量 我不关心这个过程有多慢 所以左右运行 GC 是可以接受的 当然我更喜欢更高效的东西 序列化对象并查看结果长度似乎不太准确 在对此方法的简单测试中 我看到整数返回值 54 Using GC