在开发中,有时需要自己写的代码会占用多大的内存。这样的话最低限度要考虑代码里面的变量会占多少内存,是否可以用其他更节省内存的方式来替代。而不幸的是C#中sizeof和Marshal.Sizeof无法判断所有的变量会占多少内存,比如一个string会占多少内存。下文给出一种方式来查看代码中各变量占用内存大小。
此方法需要使用SOS.dll的一些方法,我们可以通过安装微软的Debugging Tools for windows来得到此dll。
下载地址:http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
安装完此工具后,我们就可以在Vistual Studio里面的Immediate window里使用SOS.dll的方法来查看变量占用内存的大小。
具体演示(由于工作原因VS为日文版):
1、为了演示首先创建一个工程,然后再代码中加入一些测试代码。
演示代码
empty.Add("aaa");
empty.Add("bbb");
empty.Add("ccc");
empty.Add("ddd");
empty.Add("eee");
empty.Add("ffff");
empty.Add("ddd");
empty.Add("eee");
empty.Add("ffff");
2、在工程的属性中将Unmanaged Debugging勾中
3、在这段程序的后面打上断点,运行此程序。
4、打开Immediate窗口
5、在Immediate窗口中输入“.load sos”来加载SOS.dll
正常情况下会显示加载成功的信息:拡張 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll は読み込まれました
6、在Immediate窗口中输入“!DumpStackObjects ”查看当前都有什么变量
注意里面有一个Object列为013470d8的就是我们代码中的empty变量
7、在Immediate窗口中输入“!ObjSize 013470d8”来查看它的内存大小
可以看到这个变量占用了252bytes,我们也可以使用其他指令来查看这个变量的一些情况
8、在Immediate窗口中输入“!DumpObj 013470d8”来查看这个变量的一些信息
其中Fields的第一行,就是这个list的item,我们可以根据这行的value列来查询list的item都是什么。
9、在Immediate窗口中输入“!DumpArray 01347150”来查看list里面所有item的地址
有了这些地址就可以再通过DumpObj来查看每个变量的值以及其他信息了。
上面只是列出了SOS的一小部分指令,其实它还能查很多东西比如一个类,一个方法的信息。感兴趣的可以查看微软的MSDN:http://msdn.microsoft.com/en-us/library/bb190764(VS.80).aspx

浙公网安备 33010602011771号