你能给我举一个在.NET中导致内存碎片化的例子吗?

5

我正在通过在内存中缓存更多的内容来增强我们的应用程序性能。然而,令我担忧的是,我读到的关于大对象堆在垃圾回收过程中并没有真正紧凑的文章,这可能会导致内存碎片。

我进行了一些小型测试,但似乎无法引起此问题。那么我的问题是:你能给我展示一段C#代码片段,它将在某个时刻由于内存碎片而导致失败吗?


听起来更像是一个漏洞利用,不是吗? - Eric Herlitz
不,我特别寻找一种模式,如果它没有考虑到这种“内存碎片化”,就会失败。 - Dave Van den Eynde
一个复制文件到随机位置并在复制过程中终止的循环会破坏你的硬盘... - Chibueze Opata
请看cfneese在2011年11月4日22:54发布的此文章中的代码,链接为http://connect.microsoft.com/VisualStudio/feedback/details/521147/large-object-heap-fragmentation-causes-outofmemoryexception。 - chridam
@DaveVandenEynde 当然,至少它给了你一个正确方向的推动。 - chridam
显示剩余4条评论
1个回答

2
请看一下这篇文章中的代码片段:The Dangers of the Large Object Heap,并在 Fill 函数的 catch 块之后实现这个代码,以分割 LOH(大对象堆),正如 cfneese 在 2011 年 11 月 4 日的评论中所述,该评论是针对 Large Object Heap fragmentation causes OutOfmemoryException 这个错误的。
        unsafe
        {
            var w = new StreamWriter(@".\test.txt");
            for (int i = 0; i < count; i++)
            {
                var handle = GCHandle.Alloc(smallBlocks[i], GCHandleType.Pinned);
                w.WriteLine(String.Format("{0,10}\t{1,10}", i, handle.AddrOfPinnedObject()));
                handle.Free();
            }
            w.Close();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接