A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© arbtaystpw 黑马帝   /  2011-12-9 22:27  /  4169 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求助现场!

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

10 个回复

倒序浏览
何旭 黑马帝 2011-12-10 13:23:35
沙发
GC的定义:
GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理.
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法

具体算法,我也不太了解.这里就不说了!
先上代码
string name = "张三";

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.
回复 使用道具 举报
何旭 黑马帝 2011-12-10 13:44:19
藤椅
此文是帮助arbtaystpw童鞋解惑.

GC的定义:
      GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
GC实现原理:
      通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法
具体算法,我也不太了解.这里就不说了!
先上代码:

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.


        一.静态变量是否被GC回收
        static string name = "张三";
        GC.Collect();//此方法就是调用GC的回收方法
        WeakReference wek = new WeakReference(name);//这个是弱引用类,IsAlive判断该引用对象是否存活
                Console.WriteLine("静态变量是存活:" + wek.IsAlive);

        输出结果为:True
       
        二.被引用的对象是否被GC回收
        List<Person> persons = new List<Person>();
                    for (int i = 0; i < 9000; i++ )
                    {
                      Person p = new Person();
                    }
        //Person对象的实例被List<Person>的实例引用
                    GC.Collect();
                    WeakReference wek = new WeakReference(persons);
                    Console.WriteLine("被引用的变量是存活:" + wek.IsAlive);
       
        输出结果为:True

        三.没有被引用的对象是否被GC回收
        Person p = new Person();//创建一个没有被引用的Person对象的实例
                WeakReference wek = new WeakReference(p);
                GC.Collect();
                Console.WriteLine("没有被引用的变量是否存活:" +wek.IsAlive);

        输出结果为:True
        解析:为什么没有回收呢?是因为GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾,这个对象一定将被回收。

第三,关于非托管对象,如文件句柄,数据库连接等等,如何回收呢?
       
        上面都说到GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的
        所以.Net有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
        using(){}自动帮我们调用Dispose 方法,和try{}catch(){}finally{p.Dispose()}差不多

        class Person : IDisposable
            {
                public void SayHello()
                {
                    Console.WriteLine("Hello");
                }

                public void Dispose()
                {

                    Console.WriteLine("释放资源");
                }
        }

        Person p = new Person();
                    using (p) {
                    p.SayHello();
                    }
            
总结:
             * 非托管内存中的资源类,一般需要实现IDesposable接口
             * 使用using(){},相当于try{}catch(){}finally{p.Dispose();}
             * 使用了using 作用域,会自动去调用IDisposable的实现方法
             * IDisposable的实现方法可以帮助调用Close的关闭方法。
回复 使用道具 举报
何旭 黑马帝 2011-12-10 14:22:25
板凳
GC的定义:
      GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
GC实现原理:
      通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法
具体算法,我也不太了解.这里就不说了!
先上代码:

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.


        一.静态变量是否被GC回收
        static string name = "张三";
        GC.Collect();//此方法就是调用GC的回收方法
        WeakReference wek = new WeakReference(name);//这个是弱引用类,IsAlive判断该引用对象是否存活
                Console.WriteLine("静态变量是存活:" + wek.IsAlive);

        输出结果为:True
       
        二.被引用的对象是否被GC回收
        List<Person> persons = new List<Person>();
                    for (int i = 0; i < 9000; i++ )
                    {
                      Person p = new Person();
                    }
        //Person对象的实例被List<Person>的实例引用
                    GC.Collect();
                    WeakReference wek = new WeakReference(persons);
                    Console.WriteLine("被引用的变量是存活:" + wek.IsAlive);
       
        输出结果为:True

        三.没有被引用的对象是否被GC回收
        Person p = new Person();//创建一个没有被引用的Person对象的实例
                WeakReference wek = new WeakReference(p);
                GC.Collect();
                Console.WriteLine("没有被引用的变量是否存活:" +wek.IsAlive);

        输出结果为:True
        解析:为什么没有回收呢?是因为GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾,这个对象一定将被回收。

第三,关于非托管对象,如文件句柄,数据库连接等等,如何回收呢?
       
        上面都说到GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的
        所以.Net有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
        using(){}自动帮我们调用Dispose 方法,和try{}catch(){}finally{p.Dispose()}差不多

        class Person : IDisposable
            {
                public void SayHello()
                {
                    Console.WriteLine("Hello");
                }

                public void Dispose()
                {

                    Console.WriteLine("释放资源");
                }
        }

        Person p = new Person();
                    using (p) {
                    p.SayHello();
                    }
            
总结:
             * 非托管内存中的资源类,一般需要实现IDesposable接口
             * 使用using(){},相当于try{}catch(){}finally{p.Dispose();}
             * 使用了using 作用域,会自动去调用IDisposable的实现方法
             * IDisposable的实现方法可以帮助调用Close的关闭方法。
回复 使用道具 举报
朱勋 黑马帝 2011-12-10 14:24:01
报纸
本帖最后由 朱勋 于 2011-12-10 14:31 编辑

.net垃圾回机制是由系统自动为我们执行的,俗称:GC(Garbage Collection)
以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
何旭 黑马帝 2011-12-10 14:26:06
地板
GC的定义:
      GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
GC实现原理:
      通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法
具体算法,我也不太了解.这里就不说了!
先上代码:

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.


        一.静态变量是否被GC回收
        static string name = "张三";
        GC.Collect();//此方法就是调用GC的回收方法
        WeakReference wek = new WeakReference(name);//这个是弱引用类,IsAlive判断该引用对象是否存活
                Console.WriteLine("静态变量是存活:" + wek.IsAlive);

        输出结果为:True
       
        二.被引用的对象是否被GC回收
        List<Person> persons = new List<Person>();
                    for (int i = 0; i < 9000; i++ )
                    {
                      Person p = new Person();
                    }
        //Person对象的实例被List<Person>的实例引用
                    GC.Collect();
                    WeakReference wek = new WeakReference(persons);
                    Console.WriteLine("被引用的变量是存活:" + wek.IsAlive);
       
        输出结果为:True

        三.没有被引用的对象是否被GC回收
        Person p = new Person();//创建一个没有被引用的Person对象的实例
                WeakReference wek = new WeakReference(p);
                GC.Collect();
                Console.WriteLine("没有被引用的变量是否存活:" +wek.IsAlive);

        输出结果为:True
        解析:为什么没有回收呢?是因为GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾,这个对象一定将被回收。

第三,关于非托管对象,如文件句柄,数据库连接等等,如何回收呢?
       
        上面都说到GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的
        所以.Net有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
        using(){}自动帮我们调用Dispose 方法,和try{}catch(){}finally{p.Dispose()}差不多

        class Person : IDisposable
            {
                public void SayHello()
                {
                    Console.WriteLine("Hello");
                }

                public void Dispose()
                {

                    Console.WriteLine("释放资源");
                }
        }

        Person p = new Person();
                    using (p) {
                    p.SayHello();
                    }
            
总结:
             * 非托管内存中的资源类,一般需要实现IDesposable接口
             * 使用using(){},相当于try{}catch(){}finally{p.Dispose();}
             * 使用了using 作用域,会自动去调用IDisposable的实现方法
             * IDisposable的实现方法可以帮助调用Close的关闭方法。
回复 使用道具 举报
何旭 黑马帝 2011-12-10 14:26:18
7#
GC的定义:
      GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
GC实现原理:
      通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法
具体算法,我也不太了解.这里就不说了!
先上代码:

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.


        一.静态变量是否被GC回收
        static string name = "张三";
        GC.Collect();//此方法就是调用GC的回收方法
        WeakReference wek = new WeakReference(name);//这个是弱引用类,IsAlive判断该引用对象是否存活
                Console.WriteLine("静态变量是存活:" + wek.IsAlive);

        输出结果为:True
       
        二.被引用的对象是否被GC回收
        List<Person> persons = new List<Person>();
                    for (int i = 0; i < 9000; i++ )
                    {
                      Person p = new Person();
                    }
        //Person对象的实例被List<Person>的实例引用
                    GC.Collect();
                    WeakReference wek = new WeakReference(persons);
                    Console.WriteLine("被引用的变量是存活:" + wek.IsAlive);
       
        输出结果为:True

        三.没有被引用的对象是否被GC回收
        Person p = new Person();//创建一个没有被引用的Person对象的实例
                WeakReference wek = new WeakReference(p);
                GC.Collect();
                Console.WriteLine("没有被引用的变量是否存活:" +wek.IsAlive);

        输出结果为:True
        解析:为什么没有回收呢?是因为GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾,这个对象一定将被回收。

第三,关于非托管对象,如文件句柄,数据库连接等等,如何回收呢?
       
        上面都说到GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的
        所以.Net有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
        using(){}自动帮我们调用Dispose 方法,和try{}catch(){}finally{p.Dispose()}差不多

        class Person : IDisposable
            {
                public void SayHello()
                {
                    Console.WriteLine("Hello");
                }

                public void Dispose()
                {

                    Console.WriteLine("释放资源");
                }
        }

        Person p = new Person();
                    using (p) {
                    p.SayHello();
                    }
            
总结:
             * 非托管内存中的资源类,一般需要实现IDesposable接口
             * 使用using(){},相当于try{}catch(){}finally{p.Dispose();}
             * 使用了using 作用域,会自动去调用IDisposable的实现方法
             * IDisposable的实现方法可以帮助调用Close的关闭方法。
回复 使用道具 举报
何旭 黑马帝 2011-12-10 21:04:41
8#
本帖最后由 何旭 于 2011-12-10 21:05 编辑

GC的定义:
      GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础.
GC实现原理:
      通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理
为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法
具体算法,我也不太了解.这里就不说了!
先上代码:

.NET的GC机制有这样两个问题:
第一,GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾.


一.静态变量是否被GC回收
static string name = "张三";
GC.Collect();//此方法就是调用GC的回收方法
WeakReference wek = new WeakReference(name);//这个是弱引用类,IsAlive判断该引用对象是否存活
                Console.WriteLine("静态变量是存活:" + wek.IsAlive);

输出结果为:True

二.被引用的对象是否被GC回收
List<Person> persons = new List<Person>();
             for (int i = 0; i < 9000; i++ )
             {
                      Person p = new Person();
             }
//Person对象的实例被List<Person>的实例引用
             GC.Collect();
             WeakReference wek = new WeakReference(persons);
             Console.WriteLine("被引用的变量是存活:" + wek.IsAlive);

输出结果为:True

三.没有被引用的对象是否被GC回收
Person p = new Person();//创建一个没有被引用的Person对象的实例
                WeakReference wek = new WeakReference(p);
                GC.Collect();
                Console.WriteLine("没有被引用的变量是否存活:" +wek.IsAlive);

输出结果为:True
解析:为什么没有回收呢?是因为GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性,因此.Net中GC会在某一个时间点去回收垃圾,这个对象一定将被回收。

第三,关于非托管对象,如文件句柄,数据库连接等等,如何回收呢?

上面都说到GC只能回收内存中的托管对象资源,对于非托管对象例如:数据库连接,文件句柄关于很多直接和硬件打交道的资源,GC是不能涉及的
所以.Net有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
using(){}自动帮我们调用Dispose 方法,和try{}catch(){}finally{p.Dispose()}差不多

class Person : IDisposable
     {
         public void SayHello()
         {
             Console.WriteLine("Hello");
         }

         public void Dispose()
         {

             Console.WriteLine("释放资源");
         }
}

Person p = new Person();
             using (p) {
                    p.SayHello();
             }
            
总结:
             * 非托管内存中的资源类,一般需要实现IDesposable接口
             * 使用using(){},相当于try{}catch(){}finally{p.Dispose();}
             * 使用了using 作用域,会自动去调用IDisposable的实现方法
             * IDisposable的实现方法可以帮助调用Close的关闭方法。
回复 使用道具 举报
何旭 黑马帝 2011-12-10 21:07:21
9#
http://www.cnblogs.com/cilence/archive/2011/12/10/2283265.html 请参见我的博客,我本来想就在这里回复你,但是由于我的回复有代码,而黑马论坛完全限制了这些代码,所以不能发表!

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
李荣壮 黑马帝 2011-12-10 21:38:00
10#
何旭 发表于 2011-12-10 21:07
http://www.cnblogs.com/cilence/archive/2011/12/10/2283265.html 请参见我的博客,我本来想就在这里回复 ...

黑马有限制代码???我怎么不知道啊
回复 使用道具 举报
何旭 黑马帝 2011-12-10 22:10:54
11#
李荣壮 发表于 2011-12-10 21:38
黑马有限制代码???我怎么不知道啊

我传上去的时候,里边有些代码。黑马就提示:我的回复正在审核中,但是过了6个小时后,我再看,也没有看见我的回复。但是我随便写了几个字就能成功回复!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马