- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们目前正在我们的应用程序中寻找一些内存泄漏,当执行一些操作(在我们的应用程序中加载和关闭一个项目)时,我们知道内存总是增加一点点。
我们已经找到了很多,但现在,增加最多的 10 个类是(根据我们的工具 ANTS Memory Profiler 8.2):
不幸的是,我不知道这是什么,所以我很难找到我应该发布的方式/发布的内容。
我检查了实例树,但它与微软的东西一路走来。
问题是,当我们“打开/关闭”项目时,我们会检查很多(大部分)代码。
编辑 我们应用程序的一部分对某些资源使用了 dynamic
关键字,它可能是链接的。这里的类不是一次性的,我应该对它们做一些特别的事情吗?
编辑 2
我很确定这与我的dynamic
相关,似乎 C# 在使用 dynamic 时创建了一个缓存。但目前我不知道它为什么会增长(我一直加载相同的类,并且我将一直拥有完全相同的签名),也不知道如何清除它。
最佳答案
我今天在我的应用程序中分析内存泄漏时遇到了完全相同的问题 RepoZ .该工具应该在后台运行,检查 Git 存储库并定期更新 Windows 资源管理器窗口标题。后一项任务必须对“Shell.Application”进行一些 COM 调用,以找到资源管理器窗口并确定它们当前指向的路径。
像这样使用dynamic
关键字...
dynamic shell = Activator.CreateInstance(...);
foreach (object window in shell.Windows())
{
var hwnd = window.Hwnd;
...
}
...几个小时后,我最终遇到了这样的内存转储:
为了解决这个问题,我写了一点 helper class called "Combridge"关心释放 COM 对象并提供对底层 COM 对象的方法和属性的相当容易的访问。这非常简单明了,这里没有什么特别的。它利用 Reflection to COM objects ,这就是性能有所下降的原因(见下文)。
有了它,上面的代码示例如下所示:
using (var shell = new Combridge(Activator.CreateInstance(...)))
{
var windows = shell.InvokeMethod<IEnumerable>("Windows");
foreach (var window in windows)
{
var hwnd = window.GetPropertyValue<long>("Hwnd");
...
}
}
可以看到文件ExplorerWindowActor关于如何在 RepoZ 中使用它。
它并不像 dynamic
那样漂亮,而且在第一次尝试中性能也变差了。快速工作台显示如下:
我测试了 1000 次迭代,在每次迭代中处理了 10 个打开的资源管理器窗口。对于每个窗口,在该 COM 对象上调用 4 个方法或属性。所以我们谈论的是 40.000 个 COM 调用。
持续时间从约 2500 毫秒(动态
)增加到约 6000 毫秒(Combridge
)。每次调用的时间从 0.062 毫秒到 0.150 毫秒不等。
所以这需要大约 2.4 倍的时间才能完成。
这很重要,我知道。但这对我的要求来说没问题,内存泄漏也没有了。
就是这样 - 我想与您分享这个故事,希望您也可以使用该类(或它的改进版本)摆脱动态 hell 。
10 小时后,RepoZ 仍然以非常稳定的内存占用运行。
因此,在打开 10 个资源管理器窗口、每个窗口 4 个 COM 调用并且整个循环每秒两次的情况下,RepoZ 创建了大约 72.000 个 COM 实例,并进行了大约 2.880.000 个 COM 调用 总体上没有任何内存消耗的增加。
我想我们可以说问题确实来自 dynamic
。
关于c# - 内存溢出 : Having an increasing number of Microsoft. CSharp.RuntimeBinder.Semantics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080252/
我正在尝试将对象转换为动态类型,但转换失败并出现 RunTimeBinder 异常。我尝试使用我在 Stackoverflow 答案中遇到的两种方法。 代码 1: object objSum; dyn
我在我的 C# 项目中使用了 dynamic 关键字。我收到以下错误 One or more types required to compile a dynamic expression cannot
由于以下错误,我的项目无法构建: Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported.
我有以下代码创建一个分配给 smtpClient 变量的动态对象。 public class TranferManager { public void Tranfer(Account from
在 Newtonsoft JObjects 上使用 dynamic 时,我的调试输出中出现了很多 Microsoft.CSharp.RuntimeBinder.RuntimeBinderExcepti
我第一次使用 Excel 通过 Selenium WebDriver 在 c# 中读取数据,但是当我构建这段代码时,它弹出一个错误: "Missing compiler required member
我一直致力于将 MVC4 项目转换为 MVC5。第一天我遇到了“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”,但能够通过重新开始转换来解
有人知道在 C# 中对 __ComObject 实例使用“动态”关键字时是否有办法防止 RuntimeBinder 中的内存泄漏吗? 我得到了以下代码: var t = Type.GetTypeFro
我们目前正在我们的应用程序中寻找一些内存泄漏,当执行一些操作(在我们的应用程序中加载和关闭一个项目)时,我们知道内存总是增加一点点。 我们已经找到了很多,但现在,增加最多的 10 个类是(根据我们的工
我阅读了关于条件逻辑运算符的 C# 语言规范 ||和 && ,也称为短路逻辑运算符。对我来说,似乎不清楚这些是否存在可空 bool 值,即操作数类型 Nullable (也写成 bool? ),所以我
如果我在 Visual Studio 的即时窗口中使用 dynamic,我会收到错误 Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' i
我正在使用Visual Studio 2017 RC,并针对整个.NET Framework启动了一个新的ASP.NET Core项目。 这行代码将无法编译。 dynamic handler = _
我正在尝试做一个简单的 hello world 来测试在 C# 中嵌入 IronPython,但似乎无法解决这个问题.. 这是我的 C# 文件; using System; using IronPyt
我想在 Unity (ver.2018.4.13) 上使用 IBM 的 Watson API SpeechToText。 首先,我正在阅读 https://github.com/watson-deve
我是一名优秀的程序员,十分优秀!