我正在尝试调试ASP .NET应用程序中的内存问题。由于原因(10年以上的原因),此WebMethod
从托管,到不安全,再到外部c ++代码,再到DllImport
。使用相同的查询多次ping此端点会在90%的时间内产生成功的结果,但偶尔会失败。 GC发生后似乎总是失败有时候。有时它会在GC发生后成功,有时会失败。在托管代码或非托管代码中的任何位置调用GC.Collect(0)
似乎可以阻止此错误的发生。但不能这样做。
我尝试过附加内存分析器,以了解这个东西是如何运作的。不幸的是,当我开始分析会话时,错误停止发生。薛定谔的错误。
我留下的唯一想法是将每个查询的每个对象(类型和内存位置)记录到磁盘,并在比较成功的GC和不成功的GC之间的差异。不幸的是,我无法在微软的文档或在线任何地方找到这样做的方法。我确信这是可能的,但可能需要一些奇怪的反思内容?我不知道。
任何人都知道这是如何实现的?
谢谢!
答案 0 :(得分:0)
没有对象"标记为GC"。 GC发生后,垃圾收集器遍历对象图并删除所有无法从GC根到达并压缩堆的对象。在v.4之前的.NET中有关于终结器和大对象堆的一些细节,但整体GC以这种方式工作。