当前位置: 代码迷 >> C# >> 这种写法,释放内存了没
  详细解决方案

这种写法,释放内存了没

热度:94   发布时间:2016-05-05 02:59:28.0
这种写法,释放内存了没有?
httpwebquest xxx = (HttpWebRequest)HttpWebRequest.Create(sUrl); 
...
...
bits = Encoding.GetEncoding("UTF-8").GetBytes(postdata);
xxx.GetRequestStream().Write(bits, 0, bits.Length);

我的问题就是如果这样写的话,Stream这个在这句结束后从内存里释放了还是没有?
------解决思路----------------------
对于你的代码,由于它是通过 HttpWebRequest 访问外部的,那么要测试“xxx.GetRequestStream()什么时候才被自动释放掉”就需要比一般的对象稍微特别一点点:

1. 你可能要断掉网络。
2. 如果你的测试程序占用系统资源很少,或者你的windows系统资源很“充足”,可能你要等待30几秒才能看到你的监测程序显示说这个 Stream 才被GC释放掉了。

而普通的对象,很快就被 GC 释放掉了。因为它们没有底层这个特别耗时的、外部网络一直引用着的机制。


另外,在 .net 4.5.2 上的网络明显比 .net4.5 更快,而且 GC 似乎也更轻量(不会卡)。这都有可能是更加智能地调整了这个 Stream 被 GC的时机。

但是无论如何,它不存在什么内存泄漏问题!你的那个代码拿来测试,它可以 100% 被测试到 x.GetRequestStream() 返回的对象正确地被 GC 销毁了。

注意,这里说的不是理论,而是每一个东西都自己写测试程序跑过的,经过上万次测试的。
  相关解决方案