.NET对象占内存多少
来源:互联网 发布:sql中group by的用法 编辑:程序博客网 时间:2024/05/02 01:29
一直有一个小小的疑惑——.NET一个对象或者一个集合占多少内存?有没有很快速的方法获取,而不是简单的估计分析对象大小?
查了MSDN,和一些其他人的分析,得到解决是托管代码对象的大小无法真实的得到,因为存在托管对象转化成非托管的CLR优化。但我仍然不死心,非要弄个究竟!好吧,最终得到一些结果了。
sizeof关键字,用于获取值类型的大小,如int(占4个字节),char(2个字节);并且sizeof 运算符仅适用于值类型,而不适用于引用类型。所以针对对象改关键字无法使用。
查阅msdn,发现对象Marshal.SizeOf 方法,解释为返回类的非托管大小;但是仍然不能使用,因为针对的是非托管代码,如果直接使用一个类的对象,会报一个错误:"不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。";这是因为对象在内存中实际大小并不是固定的,可能这次运行一个值,下次就是另外一个值了,存在优化!
所以为了固定一个对象的大小,必须告诉CLR不优化对象在内存中的大小。这就需要在声明类的时候加上[StructLayout(LayoutKind.Sequential)]这个特性;
StructLayoutAttribute 类使用户可以控制类或结构的数据字段的物理布局。
LayoutKind 枚举 控制当导出到非托管代码时对象的布局。
这就是控制对象转化为非托管代码时占用内存固定,这样我们就可以舒服的使用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);
其实里面东西多着的,我仅仅了解了一点点,分享一下,大家一起讨论一下,如果有错误,请批评指出!
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- .NET对象占内存多少
- 查看java对象占堆内存多少个字节
- Bitmap到底占多少内存
- 一个像素占多大内存 多少字节
- 一个java对象占多少个字节?
- C++对象占多大内存?
- 引用占多少内存?欢迎讨论,(*^__^*) 嘻嘻……
- Ramdisk虚拟内存盘应该占多少物理内存?
- Android查看应用程序最高占了多少内存
- 类和对象占多少空储空间?
- java对象占用多少内存
- C# 获取对象所占内存
- 一个java对象到底占多大内存?
- 一个Java对象到底占多大内存?
- 一个Java对象到底占多大内存?
- 一个Java对象到底占多大内存?
- 一个Java对象到底占多大内存?
- C++对象所占内存的大小
- 分享职场心得《10》
- 成员初始化列表和构造函数体初始化的区别
- ext tree 刷新某个指定的节点
- WPF 主窗口调用UserControl
- 与客户程序mysql交互的技巧
- .NET对象占内存多少
- 某年的腾讯笔试题——不使用除法运算产生新数组
- 录制终端操作并进行操作重现
- ORA-12571: TNS:packet writer failure
- 设计模式:空对象模式(Null Object Pattern)
- 更改Http请求中的内容
- 题目1003:A+B
- delphi实现图象灰度处理的3种方法
- [数据库基础]——编码标准之编码注意事项(持续更新)