【问题标题】:Why Is Object Still In Memory Snapshot After Destructor Called为什么调用析构函数后对象仍在内存快照中
【发布时间】:2020-06-22 19:10:55
【问题描述】:

我正在调查内存泄漏,我想知道为什么在调用析构函数后,内存快照中的对象计数和大小没有改变。看起来包容性大小确实下降了,但不是为零。有两行,第一行是视图,第二行是视图模型。

谁能解释为什么会这样?提前谢谢你。

编辑:我在写完这个问题后(可能大约 5 分钟后)又拍了一张内存快照,现在似乎这些物体已经消失了,所以可能需要一些时间让所有东西都消失,比如几秒钟后析构函数?

【问题讨论】:

  • 它是什么类型的对象?有不同级别的gc。我建议你阅读一下
  • @DanielA.White 关于“类型”的含义,您能更具体一点吗?您是指哪一代或某些优先属性?
  • 对象的大小是多少?是否有非托管引用等。

标签: c# memory-leaks garbage-collection prism


【解决方案1】:

谁能解释一下为什么。 . .析构函数被称为对象 Count 并且 Size 在内存快照中不会改变

.NET 没有析构函数。它有finalizers,它们只与内存管理间接相关。在运行终结器之前(或者您调用GC.SupressFinalize),无法对具有终结器的对象进行垃圾收集。但对象在其终结器运行后不会立即被垃圾回收。

当 GC 发现带有终结器的(否则)无法访问的对象时,对该对象的引用被放入可访问队列中,并且终结器线程对最终到达那里的所有对象运行终结器。该对象将有资格在其终结器运行后的下一次 GC 运行时进行垃圾收集。请注意,由于该对象已经在 GC 中幸存下来,它至少会在 Gen1 上。如果它在 Gen2 上,它可能需要一段时间才能被收集起来。

为 C# 终结器重用 C++ 析构函数语法的决定可能是一个错误。

【讨论】:

  • 哇!我现在可以在标题“C# Destructor”中找到数十篇名为“C# Destructor”的文章,而我从未遇到过 Finalizer。由于名称相似,我在考虑 GC 是从 C++ 继承的。我试图调用它,虽然我知道我无法控制,但我决定我不会再固执了:) 感谢您提供准确的信息
猜你喜欢
  • 2021-06-30
  • 2016-03-02
  • 2010-10-16
  • 1970-01-01
  • 2014-06-13
  • 2018-05-07
  • 2014-08-26
  • 1970-01-01
  • 2022-10-05
相关资源
最近更新 更多