日期:2014-05-17  浏览次数:21467 次

static属性会被垃圾回收吗?
一个类如果没有定义为static但里面的属性是static的
该属性会被回收吗?
如果类是定义为static的呢?
例如:

public class Test1
{
    public static string Name;
}



public static class Test2
{
    public static string Name;
}

Test1中的Name什么时候会被回收?Test2中的Name什么时候会被回收?

------解决方案--------------------
一旦初始化后都不会被回收
------解决方案--------------------
static的本意是静态的,即一直存在于内存当中,直到你修改了它的值或者程序关闭时会改变或销毁。
------解决方案--------------------
肯定会被自动回收吧,只是静态比实例活得更久一点;
只要程序中的代码没法访问到了这个实例,就会被贴上个可回收的标记,随时都有可能被GC回收;
而静态成员是属于类所有,都是直接通过类去访问,又不是通过实例访问、只有实例有生命周期,而类貌似没有生命周期这一说法吧?

坐等大牛解释
------解决方案--------------------
静态变量一直保存在内存中,直到程序结束
------解决方案--------------------
引用:
肯定会被自动回收吧,只是静态比实例活得更久一点;
只要程序中的代码没法访问到了这个实例,就会被贴上个可回收的标记,随时都有可能被GC回收;
而静态成员是属于类所有,都是直接通过类去访问,又不是通过实例访问、只有实例有生命周期,而类貌似没有生命周期这一说法吧?

坐等大牛解释

对象实例会被回收,静态属性是使用对象名引用
------解决方案--------------------
两个例子中的Name属性本身占的32个bit是永远不会回收的
按常理推断,它指向的对象一旦你设置Name=null并且没有其他引用时就可以被回收

但string又是个特殊的类,有可能有什么缓存之类的东西就不晓得了
------解决方案--------------------
不会回收的。参见《CLR via C#》一书的说明:
A static field keeps whatever object it refers to forever or until the AppDomain 
that the types are loaded into is unloaded. A common way to leak memory is to have a 
static field refer to a collection object and then to keep adding items to the collection object. The static field keeps the collection object alive and the collection object keeps all its 
items alive. For this reason, it is best to avoid static fields whenever possible.