gpt4 book ai didi

memory-leaks - 终结器队列增长但托管堆没有

转载 作者:行者123 更新时间:2023-12-04 20:50:10 26 4
gpt4 key购买 nike

我们有某种泄漏,我不明白其性质。 Gen0/1/2 堆的大小不会增加,但是工作集会增加,直到我们 OOM。

DebugDiag 告诉我 CLR.DLL 拥有不断增加的内存,并告诉我我们有一个不断增长的终结器队列 - 数以千计的 Texture2D(它是一个 XNA 应用程序)对象随着时间的推移而增加......但是没有分析器(dotTrace、Ants、CLR Profiler) 可以找到这些对象 - 它们不会显示在堆中,并且 CLRProfiler 声称它们从未被分配过。

所以我查看 WinDbg - 我再次看到一个不断增长的 Finalizer 队列,里面充满了 Texture2D。 fReachable 是空的,它声称所有这些对象无论如何都在堆上。

*0:038> !finalizequeue
SyncBlocks to be cleaned up: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
generation 0 has 1881 finalizable objects (33e365b0->33e38314)
generation 1 has 41580 finalizable objects (33e0dc00->33e365b0)
generation 2 has 685816 finalizable objects (33b70020->33e0dc00)
Ready for finalization 0 objects (33e38314->33e38314)
MT Count TotalSize Class Name
......snip......
00ce67e0 726827 49424236 Microsoft.Xna.Framework.Graphics.Texture2D*

然后我寻找那些 726,000 个实例,以便我可以找到谁拥有它们。问题是 dumpheap 说只有 218 个。这几乎是我所期望的,并且托管分析器告诉我存在。
*0:038> !dumpheap -stat -type Microsoft.Xna.Framework.Graphics.Texture2D
total 0 objects
Statistics:
MT Count TotalSize Class Name
00ce67e0 218 14824 Microsoft.Xna.Framework.Graphics.Texture2D
Total 218 objects*

那么终结器队列中的其余项目从何而来?现在我怀疑内存分配的终结器队列会随着它的增长而增长,因此会出现 OOM。
就好像这 218 个项目由于某种原因被多次添加到终结器队列中。

非常感谢

安迪

最佳答案

为了完整起见,这就是正在发生的事情。

XNA 存在一个问题,如果您访问 Device.Texture[] 集合,则会导致在 Texture2D 上调用 ReRegisterForFinalize。 Sunburn 每一帧都访问这个集合来解决另一个 XNA 问题,所以如果你有很多纹理,那么这可以非常迅速地建立起来。

XNA 中有几个地方(Texture3D 等)使用相同的模式,所以我假设您可以通过多种方式重现它。

由于没有 XNA 5 的迹象,我们不得不解决它 - 我发现在访问集合后简单地调用 SuppressFINalize 会删除已添加的额外项目。我们认为它是安全的 :-) Sunburn 人员正在他们的代码中添加一个修复程序,我们希望这个问题会消失。

关于memory-leaks - 终结器队列增长但托管堆没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com