【问题标题】:Memory consumption keeps growing when just moving the mouse [duplicate]仅移动鼠标时内存消耗不断增加[重复]
【发布时间】:2023-03-05 03:09:01
【问题描述】:

今天我自己在试验内存消耗方面发现了一件奇怪的事情,我在任何地方都找不到这方面的任何文档,但可以肯定所有开发专家都知道我想在这里谈论什么。

问题是...当您在 VB 或 C# 中编译默认 WinForms 时,当您将鼠标移到表单上时,该操作会导致内存消耗增加到大约每秒 8-16 kb...

最重要的是内存永远不会被收集/释放!

所以你在表单上移动鼠标的时间越长,就会产生越多的 RAM 消耗并且永远不会下降,从而可能导致 StackOverFlow 错误,这是我全神贯注的主要原因......

我有一个 WinForms 应用程序,它需要保持运行数小时,并且鼠标需要每秒在应用程序上从一个点移动到另一个点,所以我需要执行一种方法来避免这种奇怪的内存消耗问题自己产生一个 stackoverflow 错误。

我在 Java 应用程序中测试了同样的东西,结果非常惊人!如果你将鼠标移到一个空窗口上,那么你可以看到内存消耗是如何每秒增加 MB0s 的! ...而不是像在 VB/C# 中那样每秒几 KB,就像在 VB/C# Form 中那样,内存永远不会下降,没有回头路,人们对 Java 和该语言的内存消耗的评价是真实的。 .我认为这很糟糕。

然后在另一种语言上进行相同的测试,我选择了 C++,因为另一个很重要,我没有任何 C/C++ IDE 可以编译,所以我所做的就是选择我制作的一些官方程序在 C/C++ 中,例如“Winamp”,这一次的结果是......在 C/C++ 应用程序上移动鼠标时不会发生任何事情!内存消耗不增加,绝对零增加。

我在 C# 和 VB 中使用默认的 Windows 窗体应用程序(空 Form1.vb 类)进行了此实验,但我只使用 VB。我使用过 .Net Framework 4.0 和 4.5。在 Windows 8 x64 中。

一些专家开发者可以帮助我理解所有这些超自然的东西吗?

· 为什么在 VB/C# WinForm 中移动鼠标时内存每秒会增加 8-16 kb。

· 为什么增加的内存再也不会减少了?

· 为什么在 C/C++ 应用程序中不会出现同样的问题? (我可以理解 C++ 没有相同的引擎(框架),但无论如何......我不知道是不是这个原因。)

还有最重要的问题……

· 将鼠标移到窗体上时,我可以防止内存增加吗?可能会覆盖一些本机方法或...我不知道...有办法避免吗?

更新:

我测量内存消耗的方法就像在 TaskManager.exe 中查看内存一样

我之所以说“内存永远不会被收集”是因为当鼠标移动到表单上时,内存计数器在taskmanager上不会下降,永远不会。

更新 2

我上传了一个解释问题的视频,你可以亲眼看到! ...我没疯。

http://www.youtube.com/watch?v=sBxicL_x9HQ&feature=youtu.be

【问题讨论】:

  • 请添加有关您如何衡量内存使用情况以及您的“永远不会收集内存”声明的理由的信息。
  • 这是内存消耗 - 而不是消耗,就像你一遍又一遍地使用
  • 不看内存消耗;它会变平。许多winforms应用程序运行数周/数月/数年(?)没有问题
  • “从未”尚未发生。你放弃得太早了。
  • 问题是强有力的主张需要强有力的证据。你应该研究一下。这个网站充满了想象中的记忆问题。但没有确切的欺骗,我没有近距离投票。

标签: c# .net vb.net winforms memory


【解决方案1】:

为什么在 VB/C# WinForm 中移动鼠标时内存每秒会增加 8-16 kb。

有一些消息触发处理鼠标移动等,由表单处理。

为什么增加的内存再也不会减少了?

会的。最终,你会看到你的记忆安定下来。在 C# 和 VB.Net 中,垃圾收集器不会立即清理内存(按设计),而是让它增长,并且会根据需要进行清理。通常,您会看到 .NET 应用程序的内存使用量增长,然后急剧下降,然后再次增长,然后下降,等等。如果您的系统中有大量内存,“下降”很少发生,因为垃圾回收成本很高,使用其他地方不需要的内存绝对没有缺点

【讨论】:

  • @Henk Holterman 一个优秀的程序员会采取预防措施来管理所有可能的错误,这对于内存容量低的 PC 来说可能是一个合理的问题,我需要避免它。
  • 是的,您还没有证明存在问题(即使在低内存系统上)。我说没有。
  • @ElektroHacker 如果您在具有大量内存的 64 位系统上运行,则在内存不足之前无需收集它。 “最终”可能是一个很长的时间,这是一件好事——使用内存是一个很好的特性,而不是一个问题。清理内存的成本很高 - 只有在其他地方需要内存时才需要这样做。
  • @ElektroHacker 据我所知,虽然GC 还没有收集内存,但如果您的代码需要更多内存,所有仍待收集的内存将被重用,这意味着将不再需要任何内存。内存可能不会被其他应用程序看到,但它会被您的应用程序看到并且始终可用(对于您的应用程序)。
  • @ElectroHacker。在运行着一堆其他高内存进程的低内存计算机上尝试一下。我敢打赌,GC 会在您遇到问题之前完成它的工作。
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多