比如托管堆有1k的大小,我当前的对象已经占用完了这1k的内存,而且当前没有可以被回收的内存,这时候new一个新的对象,这会抛出outofmemoryexception的异常!如果每次new的时候都没有可用的内存分配,那么岂不是总是会抛出outofmemoryexception的异常?
也就是说系统总是存在着抛出outofmemoryexception的异常的可能?不知道这样的理解对不对?有没有人知道怎么解决这个问题?谢谢!

解决方案 »

  1.   

    你new 的时候回收器会检查内存够不够, 如果不够它就会回收掉不再使用的对象!除非你new 的这个对象大得可以,一般不太会出现这种异常
      

  2.   

    当内存不够,又无法清除当前对象,又不能扩展内存。那除了抛出异常,.NET又有什么可以做的吗^_^但你是知道那些对象不在使用,或暂时不会使用,你可以捕捉这个异常,然后代码中清除不使用的对象null,dispose……,或者把内存中对象序列话后保存到文件系统中,清除对象来空出内存。
      

  3.   

    完全正确
    OutOfMemoryException可能在任何地方抛出不过这种情况非常的小
    要知道物理内存用完了还会继续占用虚拟内存,大部分情况下不需要为这个异常担心
      

  4.   

    谢谢大家!.net的托管堆的大小没有限制吗?我这边又一台服务器2G的内存,曾经在一周之内出现了若干次OutOfMemoryException(asp.net程序,在程序日志中发现)!而且我始终没有搞明白.net在回收的时候怎么知道那个对象以后不需要使用了???
      

  5.   

    垃圾回收的过程是否是这样:
    新建一个对象--当前托管堆大小不够--回收不再使用的对象说占用的内存--仍然不够则扩充托管堆大小--托管堆大小超过内存+虚拟内存限度--抛出OutOfMemoryExceptio异常!所谓托管堆是连续的内存空间是否只是一个逻辑上面的连续,而非物理上面的!?
      

  6.   

    虽然虚拟内存机制下的内存非常大,但当然也还是有限的。WINDOWS 2000/XP做为32位操作系统可以支持4G内存。但高2G是操作系统使用的,剩下的2G才是用户内存,归你使用的。WINDOWS 2000 Advanced Server 和 Datacenter Server 允许你在boot.ini文件中进行配置,从而扩展为使用3G内存。但需要使用3G内存的程序在链接时需要在映像中指定一个标识。所以,这个能否在。NET中用。我还不清楚。如果资源没有被正确的释放,而又不断申请新资源。。是会出现outofmemoryexception。