LOHFragments–Updated2015关于.NETLOH的资料很多,在各种文章中都有解释。但是,似乎有些文章缺少一点精确性。过时信息在微软项目经理BrianRasmussen的回答(2009年)中,他说限制是85000字节。他还告诉我们,有一个更奇怪的double[]情况,其大小为1000个元素。CLR团队成员MaoniStephens(MSDN,2008)也提出了相同的85000限制。在评论中,BrianRasmussen变得更加精确,让我们知道它可以用85000字节的byte[]–12字节来复制。2013年更新MarioHewardt(“高级Windows调试”的作者)在2013年告诉我们,如果我们告诉它,.NET4.5.1现在也可以压缩LOH。由于它在默认情况下处于关闭状态,因此问题仍然存在,除非您已经意识到这一点。2015年更新我无法再重现byte[]示例。使用短暴力算法,我发现我必须减去24(SOH中的byte[85000-24],LOH中的byte[85000-24]):staticvoidMain(string[]args){intdiff=0;国际代=3;while(generation>0){diff++;byte[]large=newbyte[85000-diff];generation=GC.GetGeneration(大);}Console.WriteLine(diff);我无法重现任何一个double[]语句。蛮力给了我10622个元素作为边界(SOH中的double[10622]和LOH中的double[10622]):staticvoidMain(string[]args){intsize=85000;内部步骤=85000/2;while(step>0){double[]d=newdouble[size];intgeneration=GC.GetGeneration(d);size+=(generation>0)?-step:step;步骤/=2;}安慰。写行(大小);即使我为旧的.NET框架编译应用程序,也会发生这种情况。它也不依赖于Release或Debug版本。如何解释变化?byte[]示例中从12位到24位的变化可以用CPU架构从32位到64位的变化来解释。在为x64或AnyCPU表面编译的程序中,.NET开销从2*4字节(4字节对象头+4字节方法表)增加到2*8字节(8字节对象头+8字节方法表)。此外,数组的长度属性是4个字节(32位)而不是8个字节(64位)。对于double[]示例,只需使用计算器:85000字节/64位双精度类型=10625项,足够接近了。考虑到.NET开销,结果是(85000字节-24字节)/每个双精度8个字节=10622双精度。所以double[]没有特殊处理。顺便说一句,我以前从未找到任何LOH片段的工作演示,所以我自己写了一个。只需为x86编译以下代码并运行它。它甚至包括一些调试提示。当编译为x64时,它不会工作,因为Windows可能会增加页面文件的大小,因此后续分配20MB内存可能会再次成功。以上就是C#学习教程:LOHFragment–2015更新分享的全部内容,如果对你有用,还需要了解更多C#学习教程,希望大家多多关注—classProgram{staticIListsmall=newList();静态IListbig=newList();staticvoidMain(){inttotalMB=0;尝试{Console.WriteLine("分配内存...");while(true){big.Add(新字节[10*1024*1024]);small.Add(新字节[85000-3*IntPtr.Size]);总MB+=10;Console.WriteLine("{0}MB已分配",totalMB);}}catch(OutOfMemoryException){Console.WriteLine("Memoryisfullnow.Attachanddebugifyoulike.PressEnterwhendone.");Console.WriteLine("对于WinDbg,尝试`!address-summary`和`!dumpheap-stat`。");控制台.ReadLine();big.Clear();GC.收集();Console.WriteLine("大量内存已被释放。使用相同的命令再次检查。");控制台.ReadLine();尝试{大。添加(新字节[20*1024*1024]);}catch(OutOfMemoryException){Console.WriteLine("虽然{0}MB是空闲的,但无法分配20MB。",totalMB);控制台.ReadLine();}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
