创建对象的时候0级已经满了,于是对1级进行回收是吧,如果1级也不足以创建对象就应该对2级进行回收了,2级回收完之后剩余极小一部分空间,然后对1级回收,问题来了...假如说1级回收的空间也很少,也就是说2级剩余的空间如果不够1级没有回收的移入怎么办?
请赐教!

解决方案 »

  1.   

    不存在0级、1级够不够的问题。
    0级满了就移到1级,一级满了就移到2级。如果内存存在泄漏,那么2级就会持续增长,直到系统内存用完,系统崩溃或者根据条件被回收。
    欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
    我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
      

  2.   

    0、1两级是有一定大小(GC设定的)的。超过了大小就会触发GC收集。2级相当于仓库,0级1级放不下的就都搬到2级。2级的限制基本是物理内存和虚拟内存的某种函数。因此,不存在1级清理的空间不够放0级的对象的事情,因为这种情况下,会触发GC将1级的对象(基本上是全部)都搬移到2级。而2级会震荡(没有内存泄露的话)或持续增长(存在内存泄露的话)。等到2级达到极限,以至于搬移的速度也赶不上分配的速度或者处理器已无法把更多的内存交换到虚拟内存或者内存寻址空间达到极限时,系统就会报OutOfMemoryException。当然,在此之前进程可能已经被回收了。
      

  3.   

    但我看一本书上好像是写的首先给分配:0级256k 1级2M  2级是10M,GC也可以根据创建对象的大小让0级变小,也就是说2级是固定的某个值吧,不像你说的是自动增长的.参阅:http://blog.csdn.net/yjyb/archive/2006/06/01/767964.aspx
      

  4.   

    2级是可以增长的。你也说书上只是说“首先分配”。0级和1剂是常用的,尺寸不能太大,否则会影响内存管理的性能。2级当然不可能总是10M,那还怎么执行程序。实际上0级和1级最大的时候也不止256k和2m。你要是还有疑惑,就自己写个程序,运行起来并通过PerfMon观察各种情况下3级的变化情况吧。对于这种可以立即验证的东西,事实胜于雄辩。