【问题标题】:Is static List<WeakReference> needed?需要静态 List<WeakReference> 吗?
【发布时间】:2011-11-02 14:42:23
【问题描述】:

我正在对使用 ILSpy 在 vb.net 中编写的旧 Windows 服务进行逆向工程。我想用 C# 重写旧服务。原始服务泄漏内存。

当我查看源代码时,服务类中有以下声明:

private static List<WeakReference> __ENCList = new List<WeakReference>();

这个列表只在构造函数中使用如下(imineRun是服务类):

List<WeakReference> _ENCList = imineRun.__ENCList;
            Monitor.Enter(_ENCList);
            try
            {
                imineRun.__ENCList.Add(new WeakReference(this));
            }
            finally
            {
                Monitor.Exit(_ENCList);
            }

这个列表会导致内存泄漏吗?是否需要此列表,其目的是什么?

【问题讨论】:

  • imineRun.__ENCList 没有在其他地方使用?
  • @sixlettervariables 只在构造函数中使用
  • 弱引用是一个可以但不必在 GC 收集时间删除的项目。我不知道代码是公认的做法还是糟糕的编码。
  • @NicholasButler 我可以...我不确定它是否仍然免费并且我没有安装它。我很确定它会给出相同的结果。
  • Reflector 不再免费(抱怨)。一个很好的选择是 dotPeek。但我非常怀疑反编译后的输出是否会有任何重大差异。

标签: c# multithreading windows-services weak-references


【解决方案1】:

因为它在你的代码中没有用到,所以它不是服务的必要部分。现在,我环顾四周,正如我之前在 IL 输出中看到的那样,显然你偶然发现了Edit-and-Continue code which was left in the service。根据博客文章,它显然可能是高内存使用的罪魁祸首。

在生产服务器上运行以调试模式构建的模块绝不是一个好主意。事实证明,在这种情况下,调试模式模块与这些模块为 Visual Studio 的“编辑并继续”功能实现 __ENCLIST 帮助器类这一事实相结合。

我敢打赌,它是在完全调试支持的情况下编译的,而不是作为发布可执行文件。

您可以放心地忽略端口中的此代码。

【讨论】:

  • +1 如果他所要做的就是在发布模式下重新编译源代码以修复内存问题,那么肯定会让 OP 的生活更轻松 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2016-12-26
  • 2019-12-25
相关资源
最近更新 更多