相关疑难解决方法(0)

大对象堆碎片

我正在研究的C#/ .NET应用程序正在遭受缓慢的内存泄漏.我已经使用CDB和SOS来尝试确定发生了什么,但数据似乎没有任何意义,所以我希望你们中的一个人之前可能已经经历过这种情况.

该应用程序在64位框架上运行.它不断地计算并将数据序列化到远程主机,并且正在大量地击中大对象堆(LOH).但是,我希望大多数LOH对象都是瞬态的:一旦计算完成并且已经发送到远程主机,就应该释放内存.然而,我所看到的是大量(实时)对象数组与空闲的内存块交织,例如,从LOH中获取一个随机段:

0:000> !DumpHeap 000000005b5b1000  000000006351da10
         Address               MT     Size
...
000000005d4f92e0 0000064280c7c970 16147872
000000005e45f880 00000000001661d0  1901752 Free
000000005e62fd38 00000642788d8ba8     1056       <--
000000005e630158 00000000001661d0  5988848 Free
000000005ebe6348 00000642788d8ba8     1056
000000005ebe6768 00000000001661d0  6481336 Free
000000005f214d20 00000642788d8ba8     1056
000000005f215140 00000000001661d0  7346016 Free
000000005f9168a0 00000642788d8ba8     1056
000000005f916cc0 00000000001661d0  7611648 Free
00000000600591c0 00000642788d8ba8     1056
00000000600595e0 00000000001661d0   264808 Free
...
Run Code Online (Sandbox Code Playgroud)

显然,如果我的应用程序在每次计算期间创建长寿命的大对象,我会期望这种情况.(它确实这样做,我接受会有一定程度的LOH碎片,但这不是问题.)问题是你可以在上面的转储中看到的非常小的(1056字节)对象数组,我在代码中看不到正在创建,并以某种方式保持根深蒂固.

另请注意,转储堆段时CDB不报告类型:我不确定这是否相关.如果我转储标记的(< - )对象,CDB/SOS报告正常:

0:015> !DumpObj 000000005e62fd38
Name: System.Object[]
MethodTable: 00000642788d8ba8
EEClass: 00000642789d7660
Size: 1056(0x420) bytes
Array: Rank 1, Number of elements 128, Type CLASS …
Run Code Online (Sandbox Code Playgroud)

.net c# memory-leaks memory-management windbg

96
推荐指数
2
解决办法
3万
查看次数

强制数组的垃圾收集,C#

我有一个问题,其中一对三维数组分配了大量的内存,程序有时需要用更大/更小的替换它们并抛出OutOfMemoryException.

示例:有5个分配的96MB阵列(200x200x200,每个条目中有12个字节的数据),程序需要用210x210x210(111MB)替换它们.它以类似于此的方式执行:

array1 = new Vector3[210,210,210];
Run Code Online (Sandbox Code Playgroud)

其中array1-array5与先前使用的字段相同.这应该将旧数组设置为垃圾收集的候选者,但是看起来GC不能足够快地执行并且在分配新数组之前分配旧数组 - 这会导致OOM - 而如果它们在新分配之前释放,则空间应该是足够.

我正在寻找的是一种做这样的事情的方法:

GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
Run Code Online (Sandbox Code Playgroud)

我不确定完整的垃圾收集是否是一个好主意,因为该代码可能(在某些情况下)需要经常执行.

有没有正确的方法呢?

c# arrays xna garbage-collection out-of-memory

17
推荐指数
3
解决办法
2万
查看次数

使用GC.AddMemoryPressure()防止OutOfMemoryException?

我正在调试一个方法,我们用它来标记具有特定文本的图像,然后在我们的系统中显示它们.

标签方法目前看起来像这样:

private static Image TagAsProductImage(Image image)
{
    try
    {
        // Prepares the garbage collector for added memory pressure (500000 bytes is roughly 485 kilobytes).
        // Should solve some OutOfMemoryExceptions.
        GC.AddMemoryPressure(500000);

        using (Graphics graphics = Graphics.FromImage(image))
        {
            // Create font.
            Font drawFont = new Font("Tahoma", image.Width*IMAGE_TAG_SIZE_FACTOR);

            // Create brush.
            SolidBrush drawBrush = new SolidBrush(Color.Black);

            // Create rectangle for drawing.
            RectangleF drawRect = new RectangleF(0, image.Height - drawFont.GetHeight(), image.Width,
                                                    drawFont.GetHeight());

            // Set format of string to be right-aligned.
            StringFormat drawFormat = …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection out-of-memory

16
推荐指数
2
解决办法
6909
查看次数

抑制C#垃圾回收

我的应用程序分配了大量的内存(数百万个小对象,总计几千兆字节)并且长时间保留它.

  1. 是.NET浪费时间检查所有这些数据来做GC吗?
  2. Gen 2 GC多久出现一次(检查所有对象的那个)?
  3. 有没有办法降低它的频率或暂时抑制它的发生?
  4. 我确切地知道当我准备好收集大量内存时,有什么方法可以优化它吗?我目前正在调用GC.Collect(); GC.WaitForPendingFinalizers(); 那时候.

更新:Perf计数器"GC中的%时间"显示平均值为10.6%.

c# garbage-collection

11
推荐指数
4
解决办法
2万
查看次数

.NET集合和大对象堆(LOH)

具有大量项目的.NET集合是否易于存储在LOH中?

我特别好奇List和Dictionary.在我的代码中,我将大量(40k +)相对较小的对象(比如1k)存储在临时列表和Dictionarys中进行处理.这些收藏中的物品数量是否会增加被放置在LOH上的可能性?

对于列表,假设List实现为双向链表,那么元素的数量不应该增加实际List对象的大小,但我想知道肯定.

谢谢

.net collections clr memory-management

10
推荐指数
1
解决办法
5624
查看次数

如何配置.net垃圾收集器?

我想知道如何描述垃圾收集器的性能并监视三代.我想知道是否有可能在任何时间知道当前生活的物体是什么gen0,gen1,gen2.

.net garbage-collection

4
推荐指数
1
解决办法
1712
查看次数