.NET对象占内存多少

一直有一个小小的疑惑——.NET一个对象或者一个集合占多少内存?有没有很快速的方法获取,而不是简单的估计分析对象大小?

查了MSDN,和一些其他人的分析,得到解决是托管代码对象的大小无法真实的得到,因为存在托管对象转化成非托管的CRL优化。但我仍然不死心,非要弄个究竟!好吧,最终得到一些结果了。

sizeof关键字,用于获取值类型的大小,如int(占4个字节),char(2个字节);并且sizeof 运算符仅适用于值类型,而不适用于引用类型。所以针对对象改关键字无法使用。

查阅msdn,发现对象Marshal.SizeOf 方法,解释为返回类的非托管大小;但是仍然不能使用,因为针对的是非托管代码,如果直接使用一个类的对象,会报一个错误:"不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。";这是因为对象在内存中实际大小并不是固定的,可能这次运行一个值,下次就是另外一个值了,存在优化!

所以为了固定一个对象的大小,必须告诉CRL不优化对象在内存中的大小。这就需要在声明类的时候加上[StructLayout(LayoutKind.Sequential)]这个特性;

StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局。

LayoutKind 枚举  控制当导出到非托管代码时对象的布局。

成员名称 说明
Sequential 对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局。这些成员根据在 StructLayoutAttribute..::.Pack 中指定的封装进行布局,并且可以是不连续的。
Explicit 对象的各个成员在非托管内存中的精确位置被显式控制。每个成员必须使用 FieldOffsetAttribute 指示该字段在类型中的位置。
Auto 运行库自动为非托管内存中的对象的成员选择适当的布局。使用此枚举成员定义的对象不能在托管代码的外部公开。尝试这样做将引发异常。

这就是控制对象转化为非托管代码时占用内存固定,这样我们就可以舒服的使用Marshal.SizeOf方法了。得到一个对象的大小。如果一个对象中还包含另外一个对象,那么另外一个对象可以使用这个[StructLayout(LayoutKind.Sequential)]也可以不使用,如果使用则是,该对象的大小加上这个对象的大小;如果不使用则是该对象的大小加上4个字节(就是这个对象引用大小)。

当想获取一个集合的大小时候,我们不能在List上加这个属性,因为微软的dll中的类,那么我们怎么样才能获取对应的大小呢?其实还用一种简单的方式,就是将对象或者集合转化成内存流,再获取内存流的大小就ok了,虽然有一些其他影响大小,但基本上可以正确的粗略估计一个对象在内存的大小或者比较俩个对象、集合的大小的!

主要代码:

BinaryFormatter binaryFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
binaryFormatter.Serialize(stream, personList);
stream.Seek(0, SeekOrigin.Begin);

其实里面东西多着的,我仅仅了解了一点点,分享一下,大家一起讨论一下,如果有错误,请批评指出!

 
 
 

.NET对象占内存多少的更多相关文章

  1. Java对象的内存模型(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  2. Java对象的内存(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  3. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  4. 如何计算Java对象所占内存的大小

    [ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId ...

  5. 复杂Java对象所占内存的大小

    我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...

  6. Object o = new Object()占多少个字节?-对象的内存布局

    一.先上答案 这个问题有坑,有两种回答 第一种解释: object实例对象,占16个字节. 第二种解释: Object o:普通对象指针(ordinary object pointer),占4个字节. ...

  7. 4种方法教你如何查看java对象所占内存大小

    摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...

  8. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  9. JAVA数组所占内存大小的对比

    1.两个数据模型 第一个是基本类型数组,第二个使用的是Float对象数组 public class SummaryModel{ private float[] summaryData; public ...

随机推荐

  1. JUnit4教程-高速入口

    前言 大学刚学java当听说JUnit该,单元测试框架,使用非常简单的测试框架,JUnit测试测试框架将更加方便,easy.编写測试代码也是简单.明了,功能强大.今天我给大家简单分享一下最新JUnit ...

  2. Aspose.Words:如何添加另一个WORD文档中的Node对象

    原文:Aspose.Words:如何添加另一个WORD文档中的Node对象 首先看一段代码,这段代码意图从docSource中获取第一个表格,并插入docTarget的末尾: , true); doc ...

  3. linuxsocket通信recv研究缓存机制

        曾有过这样一个小疑问.当一个进程注册的插座后,,假设插座没有被调用recv函数接受包.能接受到数据包吗? 或者这样说,假设我的程序注冊了一个套接字去接受数据包,可是每收到一个数据包都须要非常长 ...

  4. hibernate实体类型映射文件

    1.通过写hibernate映射文件.实体类型转换为数据库中的表 据实体类型而写的. 实体类型User.java package cn.wwh.www.hibernate.dd.property; i ...

  5. 读书笔记—CLR via C#章节3

    这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...

  6. proxool的配置

    //依赖的包:commons-logging-api-1.1.jar,commons-logging-1.0.4.jar,proxool-0.9.1.jar,proxool-cglib.jar,cgl ...

  7. Web层后端权限模块

    从零开始编写自己的C#框架(19)——Web层后端权限模块   不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太 ...

  8. ASP.NET MVC应用程序实现下载功能

    ASP.NET MVC应用程序实现下载功能 上次Insus.NET有在MVC应用程序实现了上传文件的功能<MVC应用程序显示上传的图片> http://www.cnblogs.com/in ...

  9. SignalR的服务器广播

    可以试试 https://github.com/angular-ui/bootstrap 这个框架啊 [渣译文] SignalR 2.0 系列:SignalR的服务器广播 2014-03-13 09: ...

  10. XLink and XPoint

    XLink 定义在 XML 文档中创建超级链接的标准方法. XPointer 允许这些超级链接指向 XML 文档中的更多具体部分(片断). XLink XLink 是 XML 链接语言(XML Lin ...