C#中,静态方法所耗内存会释放吗? 本帖最后由 thunderwolf 于 2010-11-25 16:55:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 会的,当Entry生命周期结束后,里面的静态方法消耗的内存也会被释放掉。建议楼主仔细阅读下NET下的GC机制。在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下 应该不会释放内存吧....Entry这个是类不是实体 静态method里的变量消耗的内存会在method执行完毕后释放,因为这些内存在stack里 不用担心,在.net中,任何以托管方式申请的内存占用最后都会被释放。静态变量也会在程序退出之后被释放。静态方法里面的变量申请只要是托管方式申请的,一样会被.net自动管理,最后释放。这是.net的优势之一。还有你的代码明显有语法问题。你的Entry.ReceiveData明明没有返回值,为什么上面调用的时候还strreturn = Entry.ReceiveData(str); 静态方法里面以托管方式申请的内存,在静态方法执行完毕之后,如果遇到垃圾回收,也是在收回之列。当然什么时候回收要看.net觉得是否有必要。静态成员变量不会释放,只有程序退出之后才会。这个也不用担心,静态成员变量一般都是引用模式,你可以给他不同的内存块引用,他只会保留他引用的那块,以前引用的,垃圾回收也会收集走的。所以,根本不会出现内存越耗越多的问题。.net收回机制就是只要发现某个内存块引用为0,就会回收。比如你这段代码:while (str != null) { string[] kk = str.Split(','); if (kk[0].Equals("entrybalance")) { strreturn = Entry.ReceiveData(str); sw.Write(strreturn); sw.Flush(); } }你每循环一次,KK实际上就代表不同的内存块,所以你永远只保留了一个KK,以前KK引用的内存块其实都会被垃圾回收自动收集的。不用担心内存耗尽。同样你ReceiveData方法中也不停的申请了KK,看你的意思很可能是要返回这个KK的,其实返回也只是引用,每次引用都发生了改变,以前的内存块自然会被回收,也不用担心。.net就这点好,内存方面不用你考虑,只要是托管方式申请的内存消耗,垃圾收回都会自动的处理,根本不用程序员担心这个问题。这本来就是.net,Java的优点之一。当然长期用这种语言的人,搞不懂内存是如何运作的,也不是什么好事情。 其实,.net虽然能够很智能的回收内存,但做为我们编程人员来说,如果不考虑内存消耗问题,这将从一定程度上造成我们的程序运行性能降低,系统资源消耗严重,特别是对一些大中型项目来说,如果我们对内存进行很好的释放,比如用C#中Using 语句块或是dispose()方法来手动释放资源,这些都要比等到垃圾回收站来释放内存好的多! 一个恼人的问题,“必须声明标量变量”,求助 datagridview控件里面可以添加进度条控件吗? 关于embed src 动态赋值的问题请教。。 GetType有什么用处,用在什么地方? 新手提问,一个关于listview的小问题! 求一个c/s模式的设计思路(C# WinForm) winfrom程序里怎么实现播放mp4、mp3的媒体文件 C#中成对出现随机数 SQL语句问题。求助!!!!还是那个问题。 为什么不能创建WEB项目? C#里说的三层框架是不是这个意思 C# 调用百度或者谷歌等进行搜索,如何实现?
建议楼主仔细阅读下NET下的GC机制。
在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下
静态方法里面以托管方式申请的内存,在静态方法执行完毕之后,如果遇到垃圾回收,也是在收回之列。当然什么时候回收要看.net觉得是否有必要。静态成员变量不会释放,只有程序退出之后才会。这个也不用担心,静态成员变量一般都是引用模式,你可以给他不同的内存块引用,他只会保留他引用的那块,以前引用的,垃圾回收也会收集走的。所以,根本不会出现内存越耗越多的问题。.net收回机制就是只要发现某个内存块引用为0,就会回收。比如你这段代码:
while (str != null)
{
string[] kk = str.Split(','); if (kk[0].Equals("entrybalance"))
{
strreturn = Entry.ReceiveData(str);
sw.Write(strreturn);
sw.Flush();
}
}你每循环一次,KK实际上就代表不同的内存块,所以你永远只保留了一个KK,以前KK引用的内存块其实都会被垃圾回收自动收集的。不用担心内存耗尽。
同样你ReceiveData方法中也不停的申请了KK,看你的意思很可能是要返回这个KK的,其实返回也只是引用,每次引用都发生了改变,以前的内存块自然会被回收,也不用担心。
.net就这点好,内存方面不用你考虑,只要是托管方式申请的内存消耗,垃圾收回都会自动的处理,根本不用程序员担心这个问题。
这本来就是.net,Java的优点之一。当然长期用这种语言的人,搞不懂内存是如何运作的,也不是什么好事情。