相关疑难解决方法(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万
查看次数

CL_OUT_OF_RESOURCES为2百万浮动1GB VRAM?

看起来200万个花车应该没什么大不了的,只有8MB的1GB GPU内存.我能够有时分配那么多,有时甚至比没有麻烦.当我执行clEnqueueReadBuffer时,我得到了CL_OUT_OF_RESOURCES,这看起来很奇怪.我能够嗅出问题真正开始的地方吗?在clEnqueueReadBuffer中,OpenCL不应该像这样失败吗?应该是我分配数据的时候吗?有没有办法获得更多的细节而不仅仅是错误代码?如果我能看到当OpenCL声明CL_OUT_OF_RESOURCES时分配了多少VRAM,那将会很酷.

memory nvidia opencl

5
推荐指数
3
解决办法
5573
查看次数

标签 统计

.net ×1

c# ×1

memory ×1

memory-leaks ×1

memory-management ×1

nvidia ×1

opencl ×1

windbg ×1