Rau*_*otz 40
您可以使用类似的内存分析器
.NET Memory Profiler(http://memprofiler.com/)
要么
CLR Profiler(免费)(http://clrprofiler.codeplex.com/)
var*_*run 37
粗略的方式可能是这种情况,你想知道特定对象发生了什么
// Measure starting point memory use
GC_MemoryStart = System.GC.GetTotalMemory(true);
// Allocate a new byte array of 20000 elements (about 20000 bytes)
MyByteArray = new byte[20000];
// Obtain measurements after creating the new byte[]
GC_MemoryEnd = System.GC.GetTotalMemory(true);
// Ensure that the Array stays in memory and doesn't get optimized away
GC.KeepAlive(MyByteArray);
Run Code Online (Sandbox Code Playgroud)
可能会像这样获得过程广泛的东西
long Process_MemoryStart = 0;
Process MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 ;)
您还可以使用WinDbg和SOS或SOSEX(如SOS与更多命令和一些现有的改进)WinDbg扩展.用于分析特定内存地址对象的命令是!objsize
要记住的一个非常重要的项目是!objsize只给出了类本身的大小,并且不一定包括类中包含的聚合对象的大小 - 我不知道它为什么不这样做因为它是相当的有时令人沮丧和误导.
我在Connect网站上创建了2个功能建议,要求将此功能包含在VisualStudio中.请投票支持您希望添加的项目!
编辑: 我正在添加以下内容以澄清Charles Bretana提供的答案中的一些信息:
另外,CLR使用了大约8种不同的堆:
HTH
每个"类"都需要足够的内存来保存所有它的运行时调用的所有成员的jit编译代码(尽管如果你不调用方法很长一段时间,CLR可以释放那个内存和如果你再次调用它再次重新启动它...加上足够的内存来保存类中声明的所有静态变量...但是这个内存每个类只分配一次,无论你创建的类的实例数是多少.
对于您创建的类的每个实例(并且尚未收集垃圾),您可以通过将每个基于实例的声明变量的内存使用量相加来近似内存占用量...(字段)
引用变量(引用其他对象)占用4或8个字节(32/64位OS?)int16,Int32,Int64分别取2,4或8个字节...
字符串变量为一些元数据元素占用额外的存储空间(加上地址指针的大小)
此外,对象中的每个引用变量也可以被视为"间接地"包括它指向的对象在堆上占用的内存,尽管您可能希望将该内存计为属于该对象而不是变量引用它......
等等
要了解应用程序中内存分配的一般意义,请在WinDbg中使用以下sos命令
!dumpheap -stat
Run Code Online (Sandbox Code Playgroud)
请注意,!dumpheap仅为您提供对象类型本身的字节,并且不包含它可能引用的任何其他对象类型的字节.
如果要查看特定对象类型的总保持字节数(对象引用的所有对象的所有字节数),请使用内存分析器,如点Trace - http://www.jetbrains.com/profiler/
如果可以 - 序列化它!
Dim myObjectSize As Long
Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48363 次 |
| 最近记录: |