繁体   English   中英

关于内存大小,清理对象

[英]Regarding memory size, cleaning up objects

考虑如下示例

class B
{
   int x;
}

class A
{
     int a;
     int b;
     B b1 = new B();

     void testMethod()
     {
        for (int i = 1; i < 10; i++)
            b1 = new B();
     }
}

class MainClass //Will never close this application
{
    static void Main(object[] args)
    {
        A a1 = new A();
        a1.testMethod();
    }
}

在上面的示例中,每次在循环中都创建一个新的B类对象。 因此,这里的问题是,当我将新对象分配给b1时,将清除前一个对象或保留它的内存。

如果没有清理并增加内存,该如何清理?

每次创建B的新对象

b1 = new B();

存储在b1的原始对象变得不可访问。 这意味着它有资格进行垃圾回收。 并不意味着它会从内存虽然立即清理!

符合GC条件的对象实际上将在“将来的某个时候”进行GC处理。 我们不知道,也不需要知道确切的时间。 只要相信GC。

换句话说,在运行testMethodB 9个对象将有资格使用GC或已被收集,而第十个对象将保留存储在变量b1

每次您这样做: b1= new B(); ,您正在向b1分配对新对象的新引用( b1 不是 ValueType ),因此,先前的引用现在未使用,因此,垃圾回收器将对其进行处理。

总结:没有增加内存,因为它是托管资源

任何值类型和引用类型的寿命取决于用于定义它的访问说明符和该功能的范围。 功能可以是定义对象的任何类,函数或循环。

在您的情况下,您定义的引用类型B b1 = new B()没有任何访问说明符(默认访问说明符),因此将其视为internal 内部定义的变量不能被外界访问。

b1范围仅限于您定义代码的for循环。

for (int i = 1; i < 10; i++)
            b1 = new B();

如果您注意到以上两个条件,则将理解在每次for循环迭代之后, 垃圾回收器都会处理对象b1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM