知识大全 .NET对象占内存多少
Posted 知
篇首语:树怕烂根,人怕无志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .NET对象占内存多少相关的知识,希望对你有一定的参考价值。
.NET对象占内存多少 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一直有一个小小的疑惑—— NET一个对象或者一个集合占多少内存?有没有很快速的方法获取 而不是简单的估计分析对象大小?
查了MSDN 和一些其他人的分析 得到解决是托管代码对象的大小无法真实的得到 因为存在托管对象转化成非托管的CLR优化 但我仍然不死心 非要弄个究竟!好吧 最终得到一些结果了
sizeof关键字 用于获取值类型的大小 如int(占 个字节) char( 个字节);并且sizeof 运算符仅适用于值类型 而不适用于引用类型 所以针对对象改关键字无法使用
查阅msdn 发现对象Marshal SizeOf 方法 解释为返回类的非托管大小;但是仍然不能使用 因为针对的是非托管代码 如果直接使用一个类的对象 会报一个错误 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量 ;这是因为对象在内存中实际大小并不是固定的 可能这次运行一个值 下次就是另外一个值了 存在优化!
所以为了固定一个对象的大小 必须告诉CLR不优化对象在内存中的大小 这就需要在声明类的时候加上[StructLayout(LayoutKind Sequential)]这个特性;
StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局
LayoutKind 枚举 控制当导出到非托管代码时对象的布局
成员名称 说明 Sequential 对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局 这些成员根据在 StructLayoutAttribute :: Pack 中指定的封装进行布局 并且可以是不连续的 Explicit 对象的各个成员在非托管内存中的精确位置被显式控制 每个成员必须使用 FieldOffsetAttribute 指示该字段在类型中的位置 Auto 运行库自动为非托管内存中的对象的成员选择适当的布局 使用此枚举成员定义的对象不能在托管代码的外部公开 尝试这样做将引发异常这就是控制对象转化为非托管代码时占用内存固定 这样我们就可以舒服的使用Marshal SizeOf方法了 得到一个对象的大小 如果一个对象中还包含另外一个对象 那么另外一个对象可以使用这个[StructLayout(LayoutKind Sequential)]也可以不使用 如果使用则是 该对象的大小加上这个对象的大小;如果不使用则是该对象的大小加上 个字节(就是这个对象引用大小)
当想获取一个集合的大小时候 我们不能在List上加这个属性 因为微软的dll中的类 那么我们怎么样才能获取对应的大小呢?其实还用一种简单的方式 就是将对象或者集合转化成内存流 再获取内存流的大小就ok了 虽然有一些其他影响大小 但基本上可以正确的粗略估计一个对象在内存的大小或者比较俩个对象 集合的大小的!
主要代码
BinaryFormatter binaryFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
binaryFormatter Serialize(stream personList);
stream Seek( SeekOrigin Begin);
cha138/Article/program/net/201311/13940相关参考
GC策略&内存申请、对象衰老 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JVM里的GC(
Java有一个很好的地方就是java的垃圾收集机制这个机制集成于jvm的对程序员来说是隐藏且不透明的这种情况下如何得到某个对象消耗的内存呢? 曾经看到过有人用以下方法来计算在生成该obj
代码最优化.NET中的内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET中内存管理
显示器的分辨率调越高,是否占内存也越高?显示分辨率调高了的影响;1、跟CPU没有太大关系,倒是和显卡及内存的关系比较密切。2、集成显卡尤其与内存关系更大,分辨率调到最佳状态为好。3、显示器(displ
浅析.NET框架下的自动内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一抽象类 抽象
如何查找.NET程序内存不断上涨的原因[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 运行
如何查找.NET程序内存不断上涨的原因[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们
减少.NET应用程序内存占用的一则实践 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近一周比
ADO.Net与ADO在数据内存中的差异讨论 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据
知识大全 使用.NET Profiler API检查并优化程序的内存使用
使用.NETProfilerAPI检查并优化程序的内存使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一