.NET 程序长时间运行占用过多的内存
我用C#.net编写了一个基于Socket的网络服务的应用程序,短时间运行很好(大约占30兆内存左右),但是长时间运行的话就会占用大量的内存。(经过一个晚上的运行内存占用...
我用C# .net 编写了一个基于Socket的网络服务的应用程序, 短时间运行很好(大约占30兆内存左右),但是长时间运行的话就会占用大量的内存。(经过一个晚上的运行内存占用量达到了400多兆).
C#又不能自己释放自己使用的内存,说是有自动垃圾回收机制,但我还是不怎么相信它,(它怎么知道这片内存我会用还是不会用了)
所以向大家请教该如何解决我上面的问题。并请教在C#程序中该如何管理好自己的内存。
我认为xx_lzj说的很有道理
但为什么不断的 new byte[] 会造成内存占用过多的问题。
程序在运行中也会new很多的对象啊,这些不用管么。还有怎样释放掉new byte[] 所占用的内存空间。 展开
C#又不能自己释放自己使用的内存,说是有自动垃圾回收机制,但我还是不怎么相信它,(它怎么知道这片内存我会用还是不会用了)
所以向大家请教该如何解决我上面的问题。并请教在C#程序中该如何管理好自己的内存。
我认为xx_lzj说的很有道理
但为什么不断的 new byte[] 会造成内存占用过多的问题。
程序在运行中也会new很多的对象啊,这些不用管么。还有怎样释放掉new byte[] 所占用的内存空间。 展开
展开全部
主要是缓冲区不断的new byte[]的问题,应该改进你的程序,重复使用缓冲区。
一般不用管理内存,除非你使用了很多非托管代码,比如引用了Win32的一些函数,这时候,你可以强制进行内存回收,但所谓强制,只是将内存打一遍无效标记而已,也不会立即回收,下面是微软关于强制回收的说明:
强制垃圾回收
垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法。
在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。
一般不用管理内存,除非你使用了很多非托管代码,比如引用了Win32的一些函数,这时候,你可以强制进行内存回收,但所谓强制,只是将内存打一遍无效标记而已,也不会立即回收,下面是微软关于强制回收的说明:
强制垃圾回收
垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法。
在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。
展开全部
你自己的对象不再使用了就Dispose掉啊.
那估计你是循环中new byte[]或者触发时的new.
一旦触发多了内存占用率就上去了.
比如你 byte [] m_Receive = new byte[1024];
你不用之后就m_Receive.Dispose();
那估计你是循环中new byte[]或者触发时的new.
一旦触发多了内存占用率就上去了.
比如你 byte [] m_Receive = new byte[1024];
你不用之后就m_Receive.Dispose();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
任务管理器里面出现了很多的W3P进程都可以关闭。而且。可以关闭一些再打开。如果还不行找个清理内存的工具。反正清理了内存咱们保存的东西也不会丢失。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最好还是不用的对象自己Dispose掉,多用用
using()
{}
using()
{}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询