C# GC.Collect()
来源:互联网 发布:linux服务器虚拟化方案 编辑:程序博客网 时间:2024/06/05 15:55
用C#写了一个运用ICE组件进行接口通信的服务程序,程序运行很正常,可是在客户端调用ICE接口时出现了大量的数据丢失,而且偶尔还通信不上,服务端最明显的现象就是telnet服务的通信端口时不通(cmd窗口一闪而过),经过大量时间的跟踪测试,最终只能通过tfs上的历史修改记录来一步一步恢复还原,最后问题定位在GC.Collect();这一句代码上:大部份接口都存在这一句代码进行内存回收,而把这句注掉以后,通信和数据传输都正常下来了!
MSDN对于强制垃圾回收的解释:
垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法。
在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。
另外做一些扩展阅读:
GC工作方式
首先我们要知道托管代码中的对象什么时候回收我们管不了(除非用GC.Collect强迫GC回收,这不推荐,后面会说明为什么)。GC会在它"高兴"的时候执行一次回收(这有许多原因,比如内存不够用时。这样做是为了提高内存分配、回收的效率)。那么如果我们用Destructor呢?同样不行,因为.NET中Destructor的概念已经不存在了,它变成了Finalizer,这会在后面讲到。目前请记住一个对象只有在没有任何引用的情况下才能够被回收。为了说明这一点请看下面这一段代码:[C#]object objA = new object();
object objB = objA;
objA = null;
// 强迫回收。
GC.Collect();
objB.ToString();
[Visual Basic]
Dim objA As New Object()
Dim objB As Object = objA
objA = Nothing
' 强迫回收。
GC.Collect()objB.ToString()
- C# GC.Collect()
- GC.Collect
- GC.Collect()简介
- hadoop streaming 慎用gc.collect()
- 读取excel(不需要GC.Collect();来释放进程)
- .NET中GC.Collect该在什么时候调用?
- collect!
- collect
- Collect
- c# GC管理【转帖】
- c# GC管理【转帖】
- C# GC机制
- c#中的GC
- c#中的GC是什么
- C# GC管理【转帖】
- C# Using GC Efficiently
- C# GC疑问
- C# GC 垃圾回收
- 致黑马后来者——你有多了解自己
- 用Delphi模拟键盘输入
- vc++获取当前使用IE的URL路径与页面的源代码
- 生成GUID字符串
- 2012系统架构设计师考试大纲
- C# GC.Collect()
- 关于模板语言Velocity的简单例子
- 我的面试,我的学习,我的经历
- HDU 2069 动态规划
- 腾讯微博 android Oauth2.0 SDK 使用介绍
- 写正确函数需要注意的地方:最大堆的创建与堆排序
- sqlserver 纯分页
- UNIX网络编程
- Android4.0 StatusBar状态栏启动