int[] a = new int[5];
string[] b = new string[1];
Run Code Online (Sandbox Code Playgroud)
两者的类型a和b继承自抽象System.Array,但内置库中没有真正的类(似乎有一些运行时类型,你找不到类型定义类的一个int[]).你能告诉我编译时会发生什么吗?为什么他们(c#团队)制作这个设计(我的意思是为什么它不是这样的Array<T>,而是他们使用带编译器魔法的抽象类)?
我需要在.NET应用程序中找出内存不足(OOM)异常的原因.使用perfmon时,当使用相对较低的内存(500-700mb)时,应用程序会与OOM崩溃,所以我假设某种堆碎片.
在研究之后,看起来WinDBG就是用来跟踪这类问题的工具.我在运行进程的服务器上设置了DebugDiag.我还设法将DebugDiag中的转储加载到WinDBG中,连接符号服务器和我自己的私有符号文件,这一切似乎都有效 - 我可以运行类似的命令!clrstack,!dumpheap -stat并且我会看到列出的类名.
我现在遇到的问题是我不知道如何解决追踪碎片的问题.WinDGB有很多命令,有很多不同的标志和选项,我不确定我应该使用哪些.我无法找到一个关于该做什么的好教程 - 大多数都是关于让WinDBG启动和运行的基本知识.
有人能指出我正确的方向吗?
我有一些麻烦来理解崩溃转储并找出OutOfMemoryExceptionWPF应用程序抛出的根本原因.应用程序运行几个小时后抛出异常,这清楚地表明存在内存泄漏.
我的第一步是看看!address -summary命令:
--- Usage Summary ---------------- RgnCount ------- Total Size -------- %ofBusy %ofTotal
<unknown> 2043 58997000 ( 1.384 Gb) 71.43% 69.22%
Heap 152 fcc3000 ( 252.762 Mb) 12.74% 12.34%
Image 1050 bc77000 ( 188.465 Mb) 9.50% 9.20%
Stack 699 7d00000 ( 125.000 Mb) 6.30% 6.10%
Free 518 3f6b000 ( 63.418 Mb) 3.10%
TEB 125 7d000 ( 500.000 kb) 0.02% 0.02%
Other 12 36000 ( 216.000 kb) 0.01% 0.01%
PEB 1 1000 ( 4.000 kb) 0.00% …Run Code Online (Sandbox Code Playgroud)