C#中,静态方法所耗内存会释放吗?

thunderwolf 2010-11-25 04:52:49

str = sr.ReadLine();
while (str != null)
{
string[] kk = str.Split(',');

if (kk[0].Equals("entrybalance"))
{
strreturn = Entry.ReceiveData(str);
sw.Write(strreturn);
sw.Flush();
}
}


class Entry
{
public static void ReceiveData(string Upinfo)
{
string str = Upinfo;
string[] kk = str.Split(',');
}

}




上面两段代码,第一段是调用第二个类的,其中Entry的静态方法所消耗的内存会被释放吗?
会不会造成系统内存持续增加
...全文
2801 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshao810 2010-11-27
  • 打赏
  • 举报
回复
静态成员不会,静态方法中的局部变量会
SunnyBoy 2010-11-27
  • 打赏
  • 举报
回复
其实,.net虽然能够很智能的回收内存,但做为我们编程人员来说,如果不考虑内存消耗问题,这将从一定程度上造成我们的程序运行性能降低,系统资源消耗严重,特别是对一些大中型项目来说,如果我们对内存进行很好的释放,比如用C#中Using 语句块或是dispose()方法来手动释放资源,这些都要比等到垃圾回收站来释放内存好的多!
softman11 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 thunderwolf 的回复:]
to 13楼
的确是,复制代码的时候,为了看的明了,删除了很多东西。

静态变量也会在程序退出之后被释放?
我的程序是一直开着的,没有退出,如果这个方法体执行完毕后,也会自动释放吗?
[/Quote]

静态方法里面以托管方式申请的内存,在静态方法执行完毕之后,如果遇到垃圾回收,也是在收回之列。当然什么时候回收要看.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的优点之一。

当然长期用这种语言的人,搞不懂内存是如何运作的,也不是什么好事情。
softman11 2010-11-26
  • 打赏
  • 举报
回复
不用担心,在.net中,任何以托管方式申请的内存占用最后都会被释放。

静态变量也会在程序退出之后被释放。

静态方法里面的变量申请只要是托管方式申请的,一样会被.net自动管理,最后释放。这是.net的优势之一。

还有你的代码明显有语法问题。

你的Entry.ReceiveData明明没有返回值,为什么上面调用的时候还strreturn = Entry.ReceiveData(str);
hardtoapply 2010-11-26
  • 打赏
  • 举报
回复
静态method里的变量消耗的内存会在method执行完毕后释放,因为这些内存在stack里
BusyDonkey 2010-11-26
  • 打赏
  • 举报
回复
会的,静态成员是和进程直接绑定的,换言之进程结束前GC会自动进行垃圾回收。
mohugomohu 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lijun84 的回复:]

静态成员不会,静态方法中的局部变量会
[/Quote]
强!
thunderwolf 2010-11-26
  • 打赏
  • 举报
回复
to 13楼
的确是,复制代码的时候,为了看的明了,删除了很多东西。

静态变量也会在程序退出之后被释放?
我的程序是一直开着的,没有退出,如果这个方法体执行完毕后,也会自动释放吗?
foxwfb 2010-11-25
  • 打赏
  • 举报
回复
静态成员不会,静态方法当中的变量会。 直接明了
beckfun 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nyq1999 的回复:]

引用 1 楼 balenoww 的回复:

会的,当Entry生命周期结束后,里面的静态方法消耗的内存也会被释放掉。
建议楼主仔细阅读下NET下的GC机制。
在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下

应该不会释放内存吧....Entry这个是类不是实体
[/Quote]
会被释放掉....
nyq1999 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 balenoww 的回复:]

会的,当Entry生命周期结束后,里面的静态方法消耗的内存也会被释放掉。
建议楼主仔细阅读下NET下的GC机制。
在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下
[/Quote]
应该不会释放内存吧....Entry这个是类不是实体
thunderwolf 2010-11-25
  • 打赏
  • 举报
回复
在我程序中,随着系统的增加,线程会越来越多,正常情况下,线程应该是200,而最后可以增加到600多


线程的增加会使内存也逐渐增加吧
thunderwolf 2010-11-25
  • 打赏
  • 举报
回复
嗯!谢谢楼上的同仁们,你们一般是如何找出内存泄漏的,内存只增不降
wolftop 2010-11-25
  • 打赏
  • 举报
回复
静态成员不会,静态方法中的局部变量会
mohugomohu 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 balenoww 的回复:]

会的,当Entry生命周期结束后,里面的静态方法消耗的内存也会被释放掉。
建议楼主仔细阅读下NET下的GC机制。
在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下
[/Quote]
如果是静态变量呢
TireYang 2010-11-25
  • 打赏
  • 举报
回复
学习学习
balenoww 2010-11-25
  • 打赏
  • 举报
回复
会的,当Entry生命周期结束后,里面的静态方法消耗的内存也会被释放掉。
建议楼主仔细阅读下NET下的GC机制。
在NET的GC里面,CLR垃圾回收共分3代,每个步骤具体做生命可以GOOGLE下

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧