相关疑难解决方法(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#如何从内存中完全删除对象

我有一个C#应用程序,包含一个带有多个数据透视表的Pivot.正常的数据透视表正确卸载并且不会泄漏内存.在其中的两个项目中,我有Drawingsurfaces,我使用Monogame来渲染3d模型.在卸载和装载他们的枢轴时,我试图完全破坏,然后完全重新创建"游戏"实例(主要是因为Monogame不允许你现在绘制到两个表面,因为他们使用了大量的内存,并且对他们两个来说都不够).

我的问题在于,当我处理加载时创建的Xamlgame时,它不释放它使用的所有内存.这意味着每次重新创建Xamlgame时,它都会开始使用越来越多的内存,直到不再剩下来为止.因此,我想知道是否有任何C#方法可以完全处理加载对象时使用的所有内存.

任何Monogame特定方式也将受到赞赏.目前我首先处理我的顶点和索引缓冲区,然后我清除了我的顶点和索引列表,然后我处理了我的Basiceffect和我的Graphicsdevicemanager,然后我在"游戏"本身上调用dispose,最后我创建了变量包含等于null的"游戏".

PS.如果您曾在XNA中完成此操作,那么您也可以帮助我,因为语法基本相同.

编辑(可能是MonoGame bug):

我现在已经设法正确清理所有缓冲区等.但是我的BasicEffect仍然存在内存泄漏.我已经尝试将其处理并使其为null,但不管它每次重新加载我的轴时它只是继续使用越来越多的内存.

c# xna windows-phone monogame windows-phone-8

6
推荐指数
3
解决办法
1万
查看次数

CLR内存消耗问题

CLR的一个问题是在缺少RAM时出现非常糟糕的行为(当托管进程的某些内存被调出时,这会导致整个系统完全冻结,甚至无法访问Ctrl-Alt-Del屏幕我假设原因是GC尝试构建可到达对象的图形并尝试扫描进程的所有内存,从而导致大量页面/页面输出操作).
这对我的.NET程序来说是一个问题,因为当输入数据很大时它会消耗大量的RAM.

我宁愿向用户显示"内存不足"的消息,而不是完全挂起他的系统^ _ ^
有没有办法实现这一点?

.net clr performance

5
推荐指数
1
解决办法
1555
查看次数

C#如何在收集垃圾之前销毁临时字符串数组?

我有一个包含逗号分隔的电子邮件地址的字符串.然后我将其加载到一个字符串数组中,然后填充一个更容易使用的列表.一旦填充了列表,我希望能够销毁现在未使用的字符串数组,因为在垃圾收集器清理这些内存浪费之前,该类仍有很多工作要做.

如何手动销毁此字符串数组...

在查看代码时,如果您有更清晰,更有效的方式填充列表,欢迎提出建议.

这是代码:

  public class EmailReportManager
    {
        private List<string> emailAddresses;

        public EmailReportManager(string emailAddressesCommaSeperatedList)
        {
            loadAddresses(emailAddressesCommaSeperatedList);
        }

        private void loadAddresses(string emailAddressesCommaSeperatedList)
        {
            string[] addresses = emailAddressesCommaSeperatedList.Split(',');
            for (int addressCount = 0; addressCount < addresses.Length; addressCount++)
            {
                this.emailAddresses.Add(addresses[addressCount]);
            }
            //Want to destroy addresses here.....

        }
    }
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
1
解决办法
2974
查看次数