.NET 垃圾回收问题

linlong1234 2009-03-19 03:07:06
各位大虾些!
帮忙看看。以下代码在执行完成后,所占用内存是否会被释放?
        
private void button1_Click(object sender, EventArgs e) {
this.Test();
GC.Collect();
}

private void Test() {
//数据类
ClassC objC = new ClassC();

//向数据类填充数据
objC.InitC();

//销毁数据类里使用的对象
objC.Dispose();
objC = null;
}

探讨一下……
...全文
552 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
linlong1234 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 agentianle 的回复:]
楼主无视沙发了?

再次张贴,请参阅
http://blog.csdn.net/gisfarmer/archive/2009/02/24/3932444.aspx

看不懂的再来讨论吧
[/Quote]
没无视,正看呢……
天乐 2009-03-20
  • 打赏
  • 举报
回复
楼主无视沙发了?

再次张贴,请参阅
http://blog.csdn.net/gisfarmer/archive/2009/02/24/3932444.aspx

看不懂的再来讨论吧
linlong1234 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 jjcheung 的回复:]
一般调用GC.Collect()后还要调用GC.WaitForPendingFinalizers(),因为GC是在另外的线程中做的。你跑的结果中Collect()后内存没有减少可能是机器的原因,在我的机器上(P4),Collect()后结果少了近一半。
[/Quote]
你是怎么查内存的……?
linlong1234 2009-03-20
  • 打赏
  • 举报
回复
今天继续哇?……
xiayuege 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 ljun80 的回复:]
GC不会马上释放。而且使用GC也会出现一些DISPOSE的问题。最好的方法是你重写DISPOSE方法。在方法中分别释放对象。C#对内存的操作不是很灵活。
[/Quote]
说的不错。微软推荐试用Dispose方法来做。具体可以参见msdn
linlong1234 2009-03-20
  • 打赏
  • 举报
回复
结了!哎……
深海之蓝 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linlong1234 的回复:]
引用 4 楼 llwinnner 的回复:
GC并不是立刻就释放资源的

我强制启动了!
“GC.Collect();”
[/Quote]
强制启动也没用,这句话 只是建议系统回收资源,什么时候回收是系统的事
lchh0917 2009-03-19
  • 打赏
  • 举报
回复
学习~继续关注
dingpin 2009-03-19
  • 打赏
  • 举报
回复
学习...
wenblue7 2009-03-19
  • 打赏
  • 举报
回复
up
ljun80 2009-03-19
  • 打赏
  • 举报
回复
GC不会马上释放。而且使用GC也会出现一些DISPOSE的问题。最好的方法是你重写DISPOSE方法。在方法中分别释放对象。C#对内存的操作不是很灵活。
linlong1234 2009-03-19
  • 打赏
  • 举报
回复
同志门 明日再研究!下班……
compleat 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 linlong1234 的回复:]
我喜欢讨论!
发表一下我的看法:
当一个内存对象不在和任何引用联系的时候,GC就可以回收该对象占用的内存了。
所以 objC = null; 以后 再启动 GC.Collect();
我觉得时可以回收内存的。
[/Quote]

我感觉对
呵呵
linlong1234 2009-03-19
  • 打赏
  • 举报
回复
一般调用GC.Collect()后还要调用GC.WaitForPendingFinalizers(),因为GC是在另外的线程中做的。你跑的结果中Collect()后内存没有减少可能是机器的原因,在我的机器上(P4),Collect()后结果少了近一半。

呵呵!真的!不行!
我重新测试了(加了WaitForPendingFinalizers )。
发现:不仅本程序内存使用量没有变化,整个机器的也没有变化。神了……
jjcheung 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 linlong1234 的回复:]
鉴于上面控制台输出内容可能会占内存。
去掉后的版本:

C# code
class Program
{
private const int maxGarbage = 1000;

static void Main(string[] args) {
//这个时候程序内存占用量是4336k

// Put some objects in memory.
Program.MakeSomeGarbage();
//这个时候程序内存占用量是4428k

// Collect all generations o…
[/Quote]
一般调用GC.Collect()后还要调用GC.WaitForPendingFinalizers(),因为GC是在另外的线程中做的。你跑的结果中Collect()后内存没有减少可能是机器的原因,在我的机器上(P4),Collect()后结果少了近一半。
linlong1234 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 linlong1234 的回复:]
鉴于上面控制台输出内容可能会占内存。
去掉后的版本:

C# code
class Program
{
private const int maxGarbage = 1000;

static void Main(string[] args) {
//这个时候程序内存占用量是4336k

// Put some objects in memory.
Program.MakeSomeGarbage();
//这个时候程序内存占用量是4428k

// Collect all generations o…
[/Quote]

大虾费心了,请看这个代码,这个短,简单!!
jjcheung 2009-03-19
  • 打赏
  • 举报
回复
看了楼主的代码明白了。在你执行完了GC.Collect()之后,objC占用的内存肯定会被释放掉,但是不会执行ClassC的Finalizer(),因为你在Dispose()中调用了 GC.SuppressFinalize(this);
liuysheng 2009-03-19
  • 打赏
  • 举报
回复
在牛人多的地方,只有学习的份了...
linlong1234 2009-03-19
  • 打赏
  • 举报
回复
鉴于上面控制台输出内容可能会占内存。
去掉后的版本:

class Program
{
private const int maxGarbage = 1000;

static void Main(string[] args) {
//这个时候程序内存占用量是4336k

// Put some objects in memory.
Program.MakeSomeGarbage();
//这个时候程序内存占用量是4428k

// Collect all generations of memory.
GC.Collect();
//这个时候程序内存占用量是4496k
}

static void MakeSomeGarbage() {
Version vt;

for (int i = 0 ; i < maxGarbage ; i++) {
// Create objects and release them to fill up memory
// with unused objects.
vt = new Version();
}
}
}


还是很奇怪……
jacklee_008 2009-03-19
  • 打赏
  • 举报
回复
SDF
加载更多回复(35)

110,565

社区成员

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

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

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