代码之家  ›  专栏  ›  技术社区  ›  willeM_ Van Onsem

有没有一种方法可以知道在C语言中是什么使物体保持生命的?#

  •  4
  • willeM_ Van Onsem  · 技术社区  · 14 年前

    我正在尝试优化程序的内存使用,因此希望在不再需要对象时删除它们。为了检查这是否正常工作,我在要删除的对象类型的析构函数中编写了一个console.writeline方法。但是,当我测试程序时,不会写入任何行(当然只有当程序终止时)。

    有没有一种方法可以获得对象、事件…使某个对象保持活动状态并防止被垃圾收集器清除。或者是否有一个分析器、调试器可以做到这一点(如果可能的话,可以与MonoDevelop兼容)?

    4 回复  |  直到 6 年前
        1
  •  4
  •   greenoldman    6 年前

    windbg+sos可以帮助理解这一点。但这需要时间来学习。例如,

    Where's your leak at? [Using WinDbg, SOS, and GCRoot to diagnose a .NET memory leak]

        2
  •  4
  •   ktutnik    14 年前

    清除发生由系统控制,如果内存分配足够小,并且系统认为不需要清除,则不会调用析构函数。 这不是生产的最佳实践,但您可以通过gc.collect()强制gc仅在测试时使用它。如果你的析构函数没有被调用,那么可能会有一个泄漏。

    我不知道Mono环境中的profiler,但是 this profiler 在窗户里就够好了。

        3
  •  3
  •   Bradley Grainger    14 年前

    .NET垃圾收集器将自动清理(释放)不再被引用的对象。但是,对于程序来说,拥有静态字段、未移动的事件处理程序或其他引用的情况并不少见,这些静态字段、未移动的事件处理程序或其他引用会使对象保持活动状态(并使用内存)的时间比严格需要的时间长。

    要解决这个问题,请使用一个内存分析器,它将识别保存对象的“根”,找出它们仍然被引用的原因,并修复导致对象仍然被引用的错误。

    一些商用和免费内存配置文件包括:

        4
  •  2
  •   Hut8    14 年前

    解除资源分配需要资源。如果垃圾收集器没有检测到正在使用的内存太多,它将不会释放其资源。如果需要确定性“析构函数”,请实现IDisposable。也见 "using" keyword