首页 > ASP.NET > The NOTE of learning ASP.NET [18] 关于.NET(GC)内存回收机制

The NOTE of learning ASP.NET [18] 关于.NET(GC)内存回收机制

    在.NET中不管是哪种类型的变量都占据着内存中的一段空间。int,datetime,float等基本数据类型在对应的内存空间中存放的是实际的数据,而引用变量则不同,引用变量所占的内存空间中存放的不是实际的对象数据,而是一段指向存放实际对象所在内存的地址,这个在C或者C++中被叫做指针,指向存放实际对象的内存的地址。一般创建一个引用变量并为它赋值的的流程(以创建Person类的对象为例):
    Person personOne = new Person();
    这条语句实际上分为三个步骤,
   (1)使用new命令在内存中创建了一个新的对象
   (2)创建Person类型的引用变量personOne(引用变量在使用前必须为其赋值,否则会编译报错,引用变量被声明后若未赋值它的值为null即未引用到任何对象)
   (3)将新建的对象所在内存的信息赋值给应用变量personOne。
    可以看出如果我们做了如上操作后再使用 personOne = null; 将personOne赋予null值的话,虽然引用变量被设置为空,但是它原先引用的对象实际上仍然存在于内存中。而我们其实并不用担心如何释放那个已经不再使用的对象所占的内存。.NET中的内存回收机制即GC(Garbage Collector)负责回收引用变量及其引用的实际对象的内存空间。
    我们需要关心两个问题:具备什么条件的对象会被GC回收并释放内存空间?GC什么时候才会回收那些已经无用的对象?
   (1)当一个内存中的对象不再被任何引用变量所引用时,它符合了被GC回收的条件。比如Person personOne = new Person();当我们把personOne设置成null时,personOne不再指向任何对象,而同时我们也无法再次访问之前personOne所指向的对象,所以这个对象对我们来说已经是没有用处的了。
   (2)GC不会在对象符合被回收的条件时立即进行回收并释放内存,它会判断在内存不够用时再去回收内存中的对象,如果内存足够大的话,它可能永远不会去回收那些仍存在于内存中但是已经无用的对象。
    了解了以上问题,就可以在编程中更好的控制资源的使用并更好的理解一些方法的用途。
   
Advertisements
分类:ASP.NET
  1. 还没有评论。
  1. No trackbacks yet.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: