今天我发现了一个奇怪的事情来试验有关内存消耗的事情,我无法在任何地方找到任何文档,但是确保所有开发人员都知道我想在这里谈论什么。
问题是......当您在VB或C#中编译默认的WinForms时,当您将鼠标移到窗体上时,该操作会导致内存消耗增加到大约每秒8-16 kb ... < / p>
最重要的是永远不会收集/释放内存!
因此,将鼠标移到窗体上的时间越长,生成的RAM消耗就越多,永远不会降低,从而可能导致StackOverFlow错误,这是我当务之急的主要原因......
我有一个WinForms应用程序需要保持运行数小时,鼠标需要每秒从一个点移动到另一个点,所以我需要执行一种方法来避免这种奇怪的内存消耗问题产生一个stackoverflow错误。
我在Java应用程序中测试了同样的东西,事情变得很糟糕!如果你将鼠标移到一个空窗口,那么你可以看到内存消耗每秒增加MB0s! ...而不是像VB / C#那样每秒几KB,就像在VB / C#Form中那样,内存永远不会停止,没有办法回归,人们对Java的看法以及该语言的内存消耗是真的。我觉得很糟糕。
然后对另一种语言进行相同的测试我选择了C ++'原因是另一种重要的,我没有任何C / C ++ IDE来编译所以我做的是选择我做的一些官方程序在C / C ++中,例如“Winamp”,这次的结果是......在C / C ++ APPS上移动鼠标时不会发生任何事情!内存消耗不会增加,绝对是零增加。
我在C#和VB中使用默认的Windows窗体应用程序(Empty Form1.vb Class)进行了此实验,但我只使用VB。我使用过.Net Framework 4.0和4.5。在Windows 8 x64中。
一些专家开发人员可以帮助我理解所有这些超自然事物吗?
·当在VB / C#WinForm中移动鼠标时,为什么内存在每秒8-16 kb之间上升。
·为什么内存的增加永远不会再次下降?
·为什么在C / C ++应用程序中不会出现同样的问题? (我可以理解C ++没有相同的引擎(Framework),但无论如何......我不知道是不是这个原因。)
最重要的问题......
·我可以防止在将鼠标移到窗体上时内存增加?,可能会覆盖一些原生方法或者......我不知道......有一种方法可以避免它吗?
更新:
我测量内存消耗的方式就像在TaskManager.exe中看到内存一样
我说“永远不会收集内存”的原因是因为当鼠标移动到表单上时,内存计数器不会在任务管理器上停止,永远不会。
更新2
我上传了一段解释问题的视频,你可以亲眼看到它! ......我不是疯了。
答案 0 :(得分:7)
为什么在VB / C#WinForm中移动鼠标时,内存会在每秒8-16 kb之间上升。
有触发处理鼠标移动等的消息,这些消息由表单处理。
为什么内存的增加永远不会再次下降?
会的。最终,你会看到你的记忆稳定下来。在C#和VB.Net中,垃圾收集器不会立即清理内存(按设计),但会让它增长,并根据需要清理 。一般情况下,您会看到.NET应用程序的内存使用量增长,然后急剧下降,然后再次增长,然后再下降等等。如果您的系统中有大量内存,则“丢弃”很少发生,因为垃圾收集很昂贵,并且绝对没有使用其他地方不需要的内存。