【发布时间】:2012-03-21 06:27:17
【问题描述】:
您好,关于本网站的第一个问题,年轻的开发人员正在为 uni 开发一个项目,我决定用 C# 构建一个应用程序启动器,它的索引 exe 位于用户指定的目录中!我的问题是我正在使用键盘钩子来允许用户在需要时调用应用程序来聚焦,在应用程序二进制(exe)在内存中时查看任务管理器,每次我使用 Alt + 调用应用程序来聚焦X “Private Working Set”(PWS) 中的内存开始时大约为 40,000k(已经很大,所以这是值得关注的)但是一旦应用程序失去焦点,我就会再次调用它来关注PWS 的内存将增加到 50,000k,并且每次我重复此操作时都会增加 10,000k...
我知道我可能没有以正确的方式处理所有对象,我已经在此表单中直观地添加了表适配器,以便与我已经处理并设置为 null 的 SQL 数据库进行交互(不知道我是否' m 打算两者都做)并调用垃圾收集器.. 基本上我想回答的是找到内存泄漏的最佳工具是什么以及我如何将表单保留在内存中但又尽可能消耗最少的资源为什么每次使应用程序成为焦点时,我的应用程序基本上都会向 PWS 添加 10,000k,它基本上是每次都创建一个新的表单实例吗?我将添加一个互斥类来防止多个实例,但这会解决我的问题吗?
我知道这可能是一个新手问题,但这是我第一次需要研究内存管理问题...
提前致谢
更新:大家好,以防万一有人偶然发现这个线程并发现这有点相关,我发现我的问题并不完全需要修复或实际上包含泄漏。安装我的应用程序并启动它后,我将应用程序的内存使用量调到了峰值,并保持任务管理器打开以监控其内存,结果证明垃圾收集器最终完成了它的工作,尽管它可能需要 2/3 分钟。
峰值内存:200,000k,对于应用程序的规模来说,这是非常高的,一旦 GC 完成其工作,它就会下降到 3,000k..
【问题讨论】:
-
听起来你可能会遇到一些问题。一方面,您永远不需要手动调用垃圾收集器。这个问题有一些对你有用的信息:stackoverflow.com/questions/3573167/memory-management-in-net
-
请尝试将 Alt + X 更改为另一个字符,例如 Alt + T,如果仍然有相同的结果,请告诉我们。
-
@MohammedShraim 已更改,但仍然有同样的问题,现在将检查您的链接。我知道我不必手动调用垃圾收集器,这只是我试图找到一种解决方法(不是一个好的解决方法)。
-
@NathanSmith 从这里无法判断您是否真的存在内存泄漏。基本上,CLR 可以根据需要使用尽可能多的内存。没有内存压力,为什么要花时间运行 gc? 最快的代码永远是你从未运行过的代码.
-
@NathanSmith 我没有你的项目在我面前运行,对吗?抓住许多免费的 c# 分析工具之一,看看它说了什么。没有任何其他信息是不可能的。
标签: c# sql winforms memory hook