| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3136 人关注过本帖
标题:页面中的静态变量啥时候被回收?
只看楼主 加入收藏
hw1024
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2008-3-11
收藏
 问题点数:0 回复次数:3 
页面中的静态变量啥时候被回收?
如题
定义了static 的变量
这个变量啥时候被系统回收,跟session类似的问题?
搜索更多相关主题的帖子: 变量 静态 页面 
2008-07-02 09:42
hebingbing
Rank: 6Rank: 6
来 自:黄土高坡
等 级:贵宾
威 望:27
帖 子:3417
专家分:371
注 册:2007-10-22
收藏
得分:0 
c#回收器回收的只是堆中的内容,而static是保存在什么地方的楼主应该很清楚吧?所以它怎么可能有什么时候被回收这样的问题呢?它根本就不回收。一般认为它的生命周期和虚拟机一样的长……
2008-07-02 18:59
hebingbing
Rank: 6Rank: 6
来 自:黄土高坡
等 级:贵宾
威 望:27
帖 子:3417
专家分:371
注 册:2007-10-22
收藏
得分:0 
说到这里看到过一篇关于回收的好文章,转帖过来大家看看……
内存有限,所以必须在不被占有的时候回收。

方法结束时值类型容易销毁。引用类型就不同。

析构函数~+类名;垃圾回收时执行任何整理。可以在任何线程上执行。

析构函数的限制:
1.不能在struct上声明;
2.不能有访问修饰符例如public;
3.不能带参数也不能接受参数,所以不可被重载,所以一个类最多一个析构函数;
4.析构函数是被自动调用,不可显示调用,不可被继承。
5.析构函数声明的标识符必须是类名;
6.析构函数声明包括extern修饰符时称外部析构函数,不提供任何实际的实现,函数体由一个分号组成。
7.非外部析构函数都都包含一个块。

任何代码不再使用某实例时,该实例就符合销毁条件。
销毁实例按照从派生程度最大到最小的顺序,调用继承链中的各个析构函数。

析构函数实际是重写了System.Object中的虚方法Finalize.

C#中永远不能亲自摧毁对象

垃圾回收器的保证:
每个对象都被摧毁;
每个对象都只被摧毁一次;
每个对象只有在该对象不存在任何引用才会摧毁;
目的:让程序员告别麻烦又易出错的清理工作。

可以调用静态方法System.GC.Collect()垃圾回收器;
但不建议这么做;

只有对象垃圾回收时才运行析构函数。含有析构函数的类会使代码和回收过程复杂影响性能。

更好的方法:
disposal方式--亲自释放
TextReader reader =new StreamReader(filename)
try{
string line;
while((line=reader.ReadLine())!=null)

finally

但这样做并不完美:
1.dispose多个资源会变得难以控制。
2.有时要修改代码(finally块中的引用不能为null)
3.不能创建解决方案的一个抽象,这意味方案难以理解,而你必须在需要该功能的任何地方重复代码。
4.对资源的引用保留在finally块之后的作用域中,这意味着可能不小心试图使用一个已经释放的资源。

using就是为解决这些而设计的;
可以将using语句作为一种明确异常安全的可靠的方式来保证一个资源总是被自动释放。这解决了人工try/finally中存在的问题。
需要dispose多个资源时有良好的扩展性;
不影响程序代码的逻辑;
对问题进行良好的抽象,避免重复性代码;
非常可靠;

注意此using非引入命名空间的using.
此using语法是
using(type variable=initialization) embeddedStstement

确保DataReader绝对Close
using(SqlDataReader dr=...)
     
     }
   }

using语句获取一个或多个资源,执行一个语句,然后处理这些资源。资源是实现IDisposable接口的类或结构。
正在使用资源的代码可以调用Dispose释放,如果不调用会由垃圾回收器处理。
using语句声明的局部变量【只读,不可ref out】,表达式必须是实现了IDisposable接口或可以隐式转化为IDisposable的一个类型。

using语句:获取-使用-处置

从析构函数中调用Dispose方法也许能保证它总是运行。
class Example:IDisposable
~example()
public virtual void Dispose();

finally
}
}
public void SomeBehavior()//示例方法

...
private void checkifdisposed(){
if(this.disposed)
{
throw new ObjectDisposedException("Example");
}
}
private Resource scarce;
private bool disposed=false;
}
注意
1.类实现了IDisposable
2.析构函数调用Dispose
3.Dispose方法是public可以随意调用
4.Dispose方法可以安全的多次调用。变量disposed指出方法以前是否运行过,只有第一次运行才会释放稀缺资源
5.Dispose方法调用静态的GC.SuppressFinalize方法。该方法防止垃圾回收器在这个对象上调用析构函数,因为对象现在已经finalized
6.类的所有常规方法都要检查对象是否disposed如果是就抛出异常
2008-07-02 19:00
yms123
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
收藏
得分:0 
记得以前学编程时的老师说“发明垃圾回收机制的人,绝对可以获得诺贝尔计算机程序奖”,在.NET里static相当于系统级的全局变量(相当于application变量),据说.NET会纪录一个对象引用的次数,当引用改对象的次数为0时,垃圾回收机制会释放掉那个对象。但在实际程序里一个对象可能会被引用得很深(一个对象创建一个对象再创建另一个对象),如此深层次估计决不简单是记录引用次数来回收的。
2008-07-02 21:00
快速回复:页面中的静态变量啥时候被回收?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017066 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved