.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. java设计模式之二抽象工厂模式(Abstract Factory)

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  2. SQL 无限级分类语句

    原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...

  3. Android Studio如何设置自己主动提示代码

    同Eclipse时间,您可以设置,无论你是设置输入不管什么信,可以提示码,在Android Studio也可以 设置.并且比Eclipse设置来的简单. 当然假设你认为代码自己主动提示会减少你的代码水 ...

  4. 笔试题&amp;面试题:CW输出矩阵

    称号:CW输出矩阵(N*N). 如果一个矩阵: 1   2   3   4 5   6   7   8 9  10 11 12 13 14 15 16 那么程序应该给出的输出为:1 2 3 4 8 1 ...

  5. js 实现复制粘贴文本过滤(保留文字和图片)

    实现复制粘贴文本过滤(保留文字和图片) demo如下: <head> <meta http-equiv="Content-Type" content=" ...

  6. iScroll 4.2.5 中文API

    概况 资料来源 http://cubiq.org/iscroll-4 http://www.cnblogs.com/wanghun/archive/2012/10/17/2727416.html ht ...

  7. 简单的php和apache的安装

    今天刚刚接触到PHP  要想深入学习一门语言  首先我们先从安装开始   对于php和apache这两个程序是比较难以安装的  好了  下面我们开始正式安装: 首先我们得准备好  apache  以及 ...

  8. mass种子模块之domready

    总结:由于IE6/7/8不支持DOMContentLoaded事件,虽然它支持onreadystatechange事件,但是readyState=complete几乎和onload事件一样,需要等页面 ...

  9. Introducing ASP.NET vNext and MVC 6

    [译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...

  10. Apworks到底是什么?

    Apworks到底是什么? 简介 Apworks是一款基于Microsoft .NET的面向领域驱动的企业级应用程序开发框架,它适用于以领域模型为核心的企业级系统的开发和集成.Apworks不仅能够很 ...