- 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/
我希望将我们代码中某些基于反射的部分替换为使用动态运行时编译性能更好的部分。环顾四周,我看到 Mono 和 Microsoft 都有单独的编译器即服务解决方案:Mono.CSharp 和 Micros
在 Open with .cs 的菜单文件有 Csharp editor和 Csharp editor with encoding .我打开了一个解决方案,并没有看到任何区别。 它们之间有什么区别?
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
一段代码抵千字... public enum enTest { a, b, c } public void PrintEnum() { foreach (var E in Enum.GetVa
我不熟悉 visual studio/c# 中的单元测试和异步操作。感谢对此的任何帮助。 我的主类 class Foo { public async Task GetWebAsync()
我搜索了一上午,似乎找不到这个问题的答案。 我有一组线程,每个线程都在工作,然后我将遍历 id 连接每个线程,然后启动新线程。检测线程何时完成以便我可以在不等待每个线程完成的情况下启动新线程的最佳方法
我有方法,它有参数“word”返回 Word 第一个字母和字符串的最后一个字母。第一个和最后一个字母之间有三点。例如,当您编写“stackoverflow”时,它会像“s...w”那样返回它 我有这个
这是我目前正在尝试的: var value = Datepicker1.Value; List data = new List(); string connetionString; MySqlConn
A a = new A(); 012E2FB8 mov ecx,58812BCh 012E2FBD调用011C30F4 012E2FC2 mov dword ptr [ebp-44h],eax 012
我有这样的 file.txt:编辑:我没有写,但我猜这很重要 - 在 file.txt 中可以有其他行! folder=c:\user;c:\test;c:\something; 我需要添加一个路径,
我从 OdcDataReader 获取一个值,该值显示为 Single 类型。我不想在代码中使用单个,所以我想将它转换成小数。但是,似乎每当我尝试将其转换为小数(或任何与此相关的东西)时,它都会丢失几
你能在最顶层的窗口上启动一个进程吗? (csharp wpf) 我有以下内容,但在此之前的当前窗口(使用具有 topmost=true 的窗口类的 wpf 窗口)在进程启动时仍位于进程的顶部。 if
我正在尝试在可移植类库中使用 .NET 4 的动态类型,但我在获取所有必需的引用时遇到了问题。我可以很好地引用 System.Core,但是 Microsoft.CSharp 给我带来了一些麻烦。似乎
我相信我发现了一个错误,该错误涉及如何将准备好的语句缓存在 Cassandra csharp 驱动程序(版本 2.7.3)的 StatementFactory 中。这是用例。 Guid key = G
大家好,我只想将 textbox.text 与数据库进行比较。这是我的代码: string str = string.Format("select Firstname,Lastname,Middlen
是否有一个简单的 csharp (cshtml) 解决方案来检测浏览器是否为 Chrome,然后不加载一段 html 代码。另外,我知道我可能只使用 javascript,但使用 C# html 组合
我有一个 Minecraft 客户端启动器,但它无法启动 Minecraft。我尝试了 TeamExtreme 中的参数,但失败了。 [原文为匈牙利,现翻译] 启动器代码: priva
是否可以在我的 CSharp 项目文件中包含代码来检查 ConfuserEx 是否正确执行,如果没有正确执行则终止编译过程?也许使用反射来检查类名是否仍然存在(即没有被混淆)? 更新:这是 .cspr
我有一堆实现接口(interface)的数据类,我们称它为ISpendable。根据在运行时处理哪个 ISpendable 类, Controller 类需要设置不同的事件监听器。 例子: publi
我已阅读构建说明 protobuf-csharp-port在Linux/Unix 系统下使用Mono。我仍然无法让它工作,最终我会打开一个线程来询问为什么,但这不是这篇文章的问题。 我正在使用 Win
我是一名优秀的程序员,十分优秀!