??????????????????????????????????????????????????????????????????????????OutOfMemoryException?????????????鶴?????????к???????檔??????????????????????????????????????????????——??????????δ???????????????????.NET?????????????????????????е???棬???????????????????????????????????о????????????????????????????????????????——???????LOH??????á????????????????????????????????????????????????????ɡ?

???????????????????????????????????32λ????

????????????????????????????????????й????????????????£?????????OutOfMemoryException???????Ч????棨????????GC Root?????????????棩??????????????2G??1G??500M??50M???????С?????????????????Ц??????????????δ???

    public class Program 
     { 
         static void Main(string[] args) 
         { 
             var smallBlockSize = 90000; 
             var largeBlockSize = 1 << 24; 
             var count = 0; 
             var bigBlock = new byte[0]; 
             try
             { 
                 var smallBlocks = new List<byte[]>(); 
                 while (true) 
                 { 
                     GC.Collect(); 
                     bigBlock = new byte[largeBlockSize]; 
                     largeBlockSize++; 
                     smallBlocks.Add(new byte[smallBlockSize]); 
                     count++; 
                 } 
             } 
             catch (OutOfMemoryException) 
             { 
                 bigBlock = null; 
                 GC.Collect(); 
                 Console.WriteLine("{0} Mb allocated"??  
                     (count * smallBlockSize) / (1024 * 1024)); 
             } 
              
             Console.ReadLine(); 
         } 
     }

??????δ?????????????????С?????????????????飬???н?С??????С?90?? 000???????????????С??16M???????????????????????????15??????????????????bigBlock?????????·????????飬????????????????????????????????????OutOfMemoryException??????????????count??С??????????С? 16M + count ??????鴦????Ч?????????????????????С???????????????????

????????????????????????н??——?????????ж??????????£????????????????δ?????????????64λ????????????????????x86??

23 Mb allocated

?????????32λ??????2G???????棬????????????????1%??

???????漴?????????????????????????????????????????????????Щ???????????????????ο?http://msdn.microsoft.com/en-us/magazine/cc534993.aspx???????????????

????.NET????????????????“Generation”??????????????G0?? G1?? G2????Generation?????????£?????′??????????????G0??????????????????????????δ???????????????????Generation??G0 -> G1 -> G2????????????????????G2?????????????G2?С?

?????????????????????????????Generation??????????????棨?????????????????????????????????????????????????????????δ??ò???????P??????????????????????????P?????????????P?????????????????????????????????????????????????????.NET?д???????????????C??C++????д????????????——??????????????????????????????????????

??????????Generation?????????????????????????????п??????Ч??????????????????????????Ч?????е??????????????????????????????????

???????????????????????????“??????”???.NET????????????????????????????СС??85?? 000???????????С??????????????????????????????????????С??85?? 000????????????????????????????????????????????????????.NET?У????д????????????????????????????棨LOH?? Large Object Heap???е???????????????????????????G2??????????????Generation 2??????????????????LOH?????????LOH??????????????????????棡?????????LOH???????÷?????????——?????????????????????????????????LOH??β?????з??????β???????????????????????????????????????????????????????????????Ч???????μ??????????????????

????????????

????1??LOH??????????????С?85K???????????С?16M??????????????????????С?85K????????????β????????

????2?????????????????????????С?16M???????????????????δ??????????????????ж?LOH?????????

????3???????????????С?16.1M???????????????LOHβ????????β????????????

????4????????????????????????棬?????????????β????

????5??????????????????????С?85K??????????????β??????

???????????????????????LOH????????????????????????16M + N?????????????????????κ???????????????????????????????OutOfMemoryExceptiojn????