.NET
¶ÔÏóÊÇÔÚÒ»¸ö½Ð×öÍйܶѣ¨managed heap£©µÄÄÚ´æÖзÖÅäµÄ£¬ËüÃǻᱻÀ¬»ø»ØÊÕÆ÷(garbage
collector)×Ô¶¯Ïú»Ù¡£ ÔÚ½²½â֮ǰ£¬Äã±ØÐëÖªµÀÀà(class)£¬¶ÔÏó(object)£¬ÒýÓÃ(reference)£¬Õ»(stack)ºÍ¶Ñ(heap)µÄÒâ˼¡£
Ò»¸öÀàÖ»ÊÇÒ»¸öÃèÊöÕâÖÖÀàÐ͵ÄʵÀý(instance)ÔÚÄÚ´æÖв¼¾ÖµÄÀ¶Í¼¡£µ±È»£¬ÀàÊǶ¨ÒåÔÚÒ»¸ö´úÂëÎļþÖУ¨ÔÚC#ÖдúÂëÎļþÒÔ.cs×÷Ϊºó׺£©¡£
Ò»¸ö¼òµ¥µÄCar À࣬¶¨ÒåÔÚÒ»¸ö½Ð×öSimpleGCµÄC# Console ApplicationÖУº
//Car.cs
2 public class Car
3 {
4 private int currSp;
5 private string petName;
6 public Car(){}
7 public Car(String name, int speed)
8 {
9 petName = name;
10 currSp = speed;
11 }
12 public override string ToString(){
13 return string.Format ("{0} is going {1}
MPH", petName, currSp);
14 }
15 } |
µ±Ò»¸öÀà±»¶¨ÒåºÃÁË£¬¾Í¿ÉÒÔʹÓÃC# new¹Ø¼ü×ÖÀ´·ÖÅäÈÎÒâÊýÁ¿µÄÕâ¸öÀà¡£
ÐèÒªÀí½âµÄÊÇ£¬new¹Ø¼ü×Ö·µ»ØµÄÊÇÒ»¸öÔÚ¶ÑÉÏÃæµÄ¶ÔÏóµÄÒýÓ㬲»ÊÇÕâ¸ö¶ÔÏó±¾Éí¡£Õâ¸öÒýÓñäÁ¿´æ´¢ÔÚÕ»ÉÏ£¬ÒÔ±ãÖ®ºóÔÚ³ÌÐòÖÐʹÓᣠµ±ÏëÔÚij¸ö¶ÔÏóÉϵ÷ÓóÉÔ±º¯Êýʱ£¬¶Ô´æ´¢µÄÕâ¸ö¶ÔÏóµÄÒýÓÃʹÓÃC# . ²Ù×÷·û£º
class Program{
2 static void Main(string[] args){
3 //ÔÚÍйܶÑÉÏÃæ´´½¨Ò»¸öеÄCar¶ÔÏó¡£·µ»ØµÄÊÇÒ»¸öÖ¸ÏòÕâ¸ö¶ÔÏóµÄÒýÓÃ
4 Car refToMyCar = new Car("Benz", 50);
5 //C# . ²Ù×÷·ûÓÃÀ´ÔÚÒýÓñäÁ¿ÒýÓõĶÔÏóÉϵ÷Óú¯Êý
6 Console.WriteLine(refToMyCar.ToString());
7 Console.ReadLine();
8 }
9 }¡¡¡¡ |
ÏÂͼչʾÁËÀ࣬¶ÔÏóºÍÒýÓÃÖ®¼äµÄ¹ØÏµ

¶ÔÏóÉúÃüÖÜÆÚµÄ»ù´¡ÖªÊ¶
µ±ÄãÔÚ´´½¨C#Ó¦ÓóÌÐòʱ£¬ÍйܶѲ»ÐèÒªÄãµÄÖ±½Ó¸ÉÔ¤¡£Êµ¼ÊÉÏ£¬.NET ÄÚ´æ¹ÜÀíµÄ»Æ½ðÔÔòºÜ¼òµ¥£º ʹÓÃnew¹Ø¼ü×ÖÔÚÍйܶÑÉÏÉêÇëÒ»¸ö¶ÔÏó Ò»µ©ÊµÀý»¯ºó£¬µ±¶ÔÏó²»ÔÙ±»Ê¹Óõģ¬À¬»ø»ØÊÕÆ÷»áÏú»ÙËü¡£ ¶ÔÓÚ¶ÁÕßÀ´Ëµ£¬ÏÂÒ»¸öÃ÷ÏÔµÄÎÊÌâÊÇ£º ¡°À¬»ø»ØÊÕÆ÷Ôõôȷ¶¨ÍйܶÑÖеĶÔÏóÊDz»ÔÙ±»Ê¹Óã¿¡± ¼ò½àµÄ´ð°¸ÊÇ£º µ±ÄãµÄ´úÂë²»ÔÙʹÓöÑÉÏÃæµÄÕâ¸ö¶ÔÏó£¬À¬»ø»ØÊÕÆ÷»á½«Õâ¸ö¶ÔÏóɾ³ý¡£
¼ÙÉèÄãÔÚ³ÌÐòµÄÀàÀïÓÐÒ»¸ö·½·¨·ÖÅäÁËÒ»¸öCar¶ÔÏóµÄ¾Ö²¿±äÁ¿£º
1 static void
MakeACar(){
2 //Èç¹ûmyCarÊÇCar¶ÔÏóµÄΨһÒýÓÃ
3 //Ëü¿ÉÄÜ»áÔÚÕâ¸ö·½·¨·µ»ØÊ±±»Ïú»Ù
4 Car myCar = new Car();
5 } |
×¢Ò⣺Car¶ÔÏóµÄÒýÓà (myCar) ÊÇÔÚMakeACar()º¯ÊýÖÐÖ±½Ó´´½¨µÄ²¢ÇÒûÓб»´«µÝµ½º¯ÊýÍⲿ(ͨ¹ýÒ»¸ö·µ»ØÖµ»òÕß
ref/out ²ÎÊý)¡£
Òò´Ë£¬Ò»µ©Õâ¸öº¯Êýµ÷ÓÃÍê³É£¬myCarµÄÒýÓò»ÔÙ¿É·ÃÎÊ£¬²¢ÇÒºÍÕâ¸öÒýÓÃÏà¹ØÁªµÄCar¶ÔÏó¿ÉÒÔ±»À¬»ø»ØÊÕÁË¡£µ«ÊÇ£¬²»Äܱ£Ö¤ÔÚMakeACar()º¯Êýµ÷ÓÃÍê³ÉºóÕâ¸ö¶ÔÏó±»Á¢¼´´ÓÄÚ´æÖÐÏú»Ù¡£ ÔÚ´ËʱֻÄܼÙÉèµ±CLR Ö´ÐÐÏ´ÎÀ¬»ø»ØÊÕʱ£¬myCar¶ÔÏóÄܹ»±»°²È«µÄÏú»Ù¡£
The CIL of new
µ±C#±àÒëÆ÷Óöµ½new¹Ø¼ü×Ö£¬Ëü»áÔÚº¯ÊýʵÏÖÖвåÈëÒ»¸ö CIL newobjÖ¸Áî¡£Èç¹ûÄã±àÒ뵱ǰµÄÀý×Ó´úÂ벢ʹÓÃildasm.exeÀ´ä¯ÀÀÉú³ÉµÄ´úÂ룬Äã»áÔÚMakeACar()º¯ÊýÖз¢ÏÖÈçϵÄCILÓï¾ä£º

ÔÚÎÒÃÇÖªµÀÍйܶÑÖеĶÔÏóʲôʱºò±»ÒƳýµÄÈ·ÇÐÌõ¼þ֮ǰ£¬×Ðϸ²é¿´Ò»ÏÂCIL newobjÖ¸ÁîµÄ×÷Óá£
Ê×ÏÈ£¬ÐèÒªÃ÷°×ÍйܶѲ»½ö½öÊÇÒ»¸ö¿ÉÓÉCLR·ÃÎʵÄËæ»úÄÚ´æ¿é¡£.NETÀ¬»ø»ØÊÕÆ÷ÊÇÒ»¸öÕû½àµÄ¶Ñ¹Ü¼Ò£¬³öÓÚÓÅ»¯µÄÄ¿µÄËü»áѹËõ¿ÕÏеÄÄÚ´æ¿é£¨µ±ÐèҪʱ£©¡£ÎªÁ˸¨ÖúѹËõ£¬Íйܶѻáά»¤Ò»¸öÖ¸Õë(ͨ³£±»½Ð×öÏÂÒ»¸ö¶ÔÏóÖ¸Õ루the
next object pointer£©»òÕßÊÇжÔÏóÖ¸Õ루new object pointer£©£©£¬Õâ¸öÖ¸ÕëÓÃÀ´±êʶÏÂÒ»¸ö¶ÔÏóÔÚ¶ÑÖзÖÅäµÄµØÖ·¡££¨
ÒëÕß×¢£ºÎªÁ˸ĽøÐÔÄÜ£¬ÔËÐÐʱ»áÔÚÒ»¸öµ¥¶ÀµÄ¶ÑÖÐΪ´óÐͶÔÏó£¨>85,000Bytes)·ÖÅäÄÚ´æ
¡£Ò»°ãÇé¿ö϶¼ÊÇÊý×飬ºÜÉÙÓÐÕâô´óµÄ¶ÔÏó¡£ À¬»ø»ØÊÕÆ÷»á×Ô¶¯ÊÍ·Å´óÐͶÔÏóµÄÄÚ´æ¡£ µ«ÊÇ£¬ÎªÁ˱ÜÃâÒÆ¶¯ÄÚ´æÖеĴóÐͶÔÏ󣨺Äʱ£©£¬²»»áѹËõ´ËÄÚ´æ¡£
£©
ÕâЩÐÅÏ¢±íÃ÷£¬newobjÖ¸Áî֪ͨCLRÀ´Ö´ÐÐÏÂÁеĺËÐÄÈÎÎñ£º
¼ÆËãÒª·ÖÅäµÄ¶ÔÏóËùÐèµÄÈ«²¿Äڴ棨°üÀ¨Õâ¸öÀàÐ͵ÄÊý¾Ý³ÉÔ±ºÍÀàÐ͵ĻùÀàËùÐèµÄÄڴ棩¡£ ¼ì²éÍйܶÑÀ´È·±£ÓÐ×ã¹»µÄ¿Õ¼äÀ´·ÅÖÃËùÉêÇëµÄ¶ÔÏó¡£Èç¹ûÓÐ×ã¹»µÄ¿Õ¼ä£¬»áµ÷ÓÃÕâ¸öÀàÐ͵Ĺ¹Ô캯Êý£¬¹¹Ô캯Êý»á·µ»ØÒ»¸öÖ¸ÏòÄÚ´æÖÐÕâ¸öжÔÏóµÄÒýÓã¬Õâ¸öжÔÏóµÄµØÖ·¸ÕºÃ¾ÍÊÇÏÂÒ»¸ö¶ÔÏóÖ¸ÕëÉÏÒ»´ÎËùÖ¸ÏòµÄλÖᣠ×îºó£¬ÔÚ°ÑÒýÓ÷µ»Ø¸øµ÷ÓÃÕß֮ǰ£¬ÈÃÏÂÒ»¸ö¶ÔÏóÖ¸ÕëÖ¸ÏòÍйܶÑÖÐÏÂÒ»¸ö¿ÉÓõÄλÖᣠÏÂÃæµÄͼ½âÊÍÁËÔÚÍйܶÑÉÏ·ÖÅä¶ÔÏóµÄϸ½Ú¡£¡¡¡¡

ÓÉÓÚÄãµÄ³ÌÐòæ×Å·ÖÅä¶ÔÏó£¬ÔÚÍйܶÑÉϵĿռä×îÖÕ»áÂú¡£µ±´¦ÀínewobjÖ¸ÁîµÄʱºò£¬CLR ·¢ÏÖÍйܶÑûÓÐ×ã¹»¿Õ¼ä·ÖÅäÇëÇóµÄÀàÐÍʱ£¬Ëü»áÖ´ÐÐÒ»´ÎÀ¬»ø»ØÊÕÀ´ÊÍ·ÅÄÚ´æ¡£Òò´Ë£¬À¬»ø»ØÊÕµÄÏÂÒ»¸ö¹æÔòÒ²ºÜ¼òµ¥£º
Èç¹ûÍйܶÑûÓÐ×ã¹»µÄ¿Õ¼ä·ÖÅäÒ»¸öÇëÇóµÄ¶ÔÏó£¬Ôò»áÖ´ÐÐÒ»´ÎÀ¬»ø»ØÊÕ¡£
µ±Ö´ÐÐÀ¬»ø»ØÊÕʱ£¬À¬»øÊÕ¼¯Æ÷ÁÙʱ¹ÒÆðµ±Ç°½ø³ÌÖеÄËùÓеĻÏß³ÌÀ´±£Ö¤ÔÚ»ØÊÕ¹ý³ÌÖÐÓ¦ÓóÌÐò²»»á·ÃÎʵ½¶Ñ¡££¨Ò»¸öÏß³ÌÊÇÒ»¸öÕýÔÚÖ´ÐеijÌÐòÖеÄÖ´Ðз¾¶£©¡£Ò»µ©À¬»ø»ØÊÕÍê³É£¬¹ÒÆðµÄÏß³ÌÓÖ¿ÉÒÔ¼ÌÐøÖ´ÐÐÁË¡£»¹ºÃ£¬.NET
À¬»ø»ØÊÕÆ÷ÊǸ߶ÈÓÅ»¯¹ýµÄ¡£
°Ñ¶ÔÏóÒýÓÃÖÃΪnull
ÓÐÁËÕâЩ֪ʶ£¬Äã¿ÉÄÜ»áÏëÔÚC#À°Ñ¶ÔÏóÒýÓÃÖÃΪnull»áÓÐʲôÊ·¢Éú¡£ ÀýÈ磬¼ÙÉèMakeACar()¸üÐÂÈçÏ£º
1 static void
MakeACar(){
2 Car myCar = new Car();
3 myCar = null;
4 }
5 |
µ±Äã¸ø¶ÔÏóÒýÓø³ÖµÎªnull£¬±àÒëÆ÷»áÉú³ÉCIL´úÂëÀ´È·±£Õâ¸öÒýÓÃ(Õâ¸öÀý×ÓÖÐÊÇmyCar£©²»»áÖ¸ÏòÈκζÔÏó¡£Èç¹û»¹ÊÇÓÃidasm.exe²é¿´Ð޸ĺóMakeACar()µÄCIL
´úÂ룬»á·¢ÏÖldnullÕâ¸ö²Ù×÷Â루Ëü»áÏòÐéÄâÖ´ÐÐÕ»ÉÏÃæÑ¹ÈëÒ»¸önull£©Ö®ºóÊÇÒ»¸ö stloc.0²Ù×÷Â루ËüÔÚ·ÖÅäµÄCar¶ÔÏóÉÏÉèÖÃnullµÄÒýÓã©£º¡¡¡¡

µ«ÊÇ£¬Äã±ØÐëÀí½âµÄÊÇ£¬ÉèÖÃÒýÓÃΪnull²»»áÇ¿ÖÆÀ¬»ø»ØÊÕÆ÷ÔÚ´ËʱÆô¶¯²¢´Ó¶ÑÉÏɾ³ýÕâ¸ö¶ÔÏó¡£ÄãΨһÍê³ÉµÄÊÂÊÇÏÔʽµØÇжÏÁËÒýÓúÍËü֮ǰָÏòµÄ¶ÔÏóÖ®¼äµÄÁªÏµ¡£
Ó¦ÓóÌÐòµÄ¸ùµÄ×÷ÓÃ(application roots)
»Øµ½À¬»ø»ØÊÕÆ÷ÈçºÎ¾ö¶¨Ò»¸ö¶ÔÏóÊDz»ÔÙ±»Ê¹Óõġ£ÎªÁËÀí½âϸ½Ú£¬ÄãÐèÒªÖªµÀÓ¦ÓóÌÐò¸ùµÄ¸ÅÄî¡£ ¼òµ¥À´Ëµ£¬Ò»¸ö¸ùÊÇÒ»¸öÒýÓã¬Õâ¸öÒýÓÃÖ¸Ïò¶ÑÉÏÃæµÄÒ»¸ö¶ÔÏóµÄ¡£ÑϸñÀ´Ëµ£¬Ò»¸ö¸ù¿ÉÒÔÓÐÒÔϼ¸ÖÖÇé¿ö£º
Ö¸ÏòÈ«¾Ö¶ÔÏó(global objects)µÄÒýÓ㨾¡¹ÜC#²»Ö§³Ö£¬µ«CIL´úÂëÔÊÐí·ÖÅäÈ«¾Ö¶ÔÏó£© Ö¸ÏòÈκξ²Ì¬¶ÔÏó(static objects)/(static fields) Ö¸ÏòÒ»¸öÓ¦ÓóÌÐò´úÂëÖеľֲ¿¶ÔÏó Ö¸Ïò´«Èëµ½Ò»¸öº¯ÊýÖеĶÔÏó²ÎÊý Ö¸ÏòµÈ´ý±»ÖÕ½á(finalized)µÄ¶ÔÏó ÈκÎÒ»¸öÖ¸Ïò¶ÔÏóµÄCPU¼Ä´æÆ÷ ÒëÕß×¢£ºÃ¿¸öÓ¦ÓóÌÐò¶¼ÓÐÒ»×é¸ù¡£
ÔÚÒ»´ÎÀ¬»ø»ØÊյĹý³ÌÖУ¬ÔËÐл·¾³»á¼ì²éÍйܶÑÉÏÃæµÄ¶ÔÏóÊÇ·ñÈÔÈ»ÊÇ´ÓÓ¦ÓóÌÐò¸ù¿Éµ½´ïµÄ¡£ÎªÁ˼ì²é¿É´ï£¬CLR»á½¨Á¢Ò»¸ö´ú±í¶ÑÉÏÿ¸ö¿É´ï¶ÔÏóµÄͼ¡£¶ÔÏóͼÓÃÀ´¼Ç¼ËùÓпɴïµÄ¶ÔÏó¡£Í¬Ê±£¬×¢ÒâÀ¬»ø»ØÊÕÆ÷¾ø²»»áÔÚͼÉϱê¼ÇÒ»¸ö¶ÔÏóÁ½´Î£¬Òò´Ë±ÜÃâÁË·³È˵ÄÑ»·ÒýÓá£
¼ÙÉèÍйܶÑÉÏÓÐÃû×ÖΪA,B,C,D,E£¬FºÍGµÄ¶ÔÏ󼯺ϡ£ÔÚÒ»´ÎÀ¬»ø»ØÊÕ¹ý³ÌÖУ¬»á¼ì²éÕâЩ¶ÔÏó£¨Í¬Ê±°üÀ¨ÕâЩ¶ÔÏó¿ÉÄܰüº¬µÄÄÚ²¿¶ÔÏóÒýÓã©ÊÇ·ñÊǸù¿É´ïµÄ¡£Ò»µ©Í¼±»½¨Á¢ÆðÀ´£¬²»¿É´ïµÄ¶ÔÏó£¨ÔÚ´ËÊǶÔÏóCºÍF£©±»±ê¼ÇΪÀ¬»ø¡£
ÏÂͼÊÇÉÏÊö³¡¾°µÄÒ»¸ö¿ÉÄܵĶÔÏóͼ£¨Äã¿ÉÒ԰ѼýÍ·¶Á×÷ÒÀÀµ»òÕßÐèÒª£¬ÀýÈç"EÒÀÀµÓÚG£¬¼ä½ÓÒÀÀµÓÚB£¬¡°A²»ÒÀÀµÈκζÔÏ󡱵ȣ©¡£

´´½¨µÄ¶ÔÏóͼÊÇÓÃÀ´¾ö¶¨ÄÄЩ¶ÔÏóÊÇÓ¦ÓóÌÐò¸ù¿É´ïµÄ¡£
Ò»µ©Ò»¸ö¶ÔÏóÒѾ±»±ê¼ÇΪÖսᣨ´ËÀý×ÓÖÐÊÇCºÍF--ÔÚͼÖÐûÓÐËûÁ©£©£¬ËüÔÚÄÚ´æÖоͱ»ÇåÀíµôÁË¡£ÔÚ´Ëʱ£¬¶ÑÉϵÄÊ£ÓàÄÚ´æ¿Õ¼ä±»Ñ¹Ëõ£¨compact
·ÒëΪѹËõ²»Ì«ºÏÊÊ£¬µ«Ò²²»ÖªµÀɶ¸üºÃµÄ´ÊÁË£¬Ñ¹Ëõºó£¬·ÖÅäµÄÄÚ´æ¿Õ¼ä¶¼ÊÇÔÚÒ»Æð£¬Á¬ÐøµÄ£©£¬Õâ»áµ¼ÖÂCLRÐ޸ĻµÄÓ¦ÓóÌÐò¸ù¼¯ºÏ£¨ºÍ¶ÔÓ¦µÄÖ¸Õ룩À´Ö¸ÏòÕýÈ·µÄÄÚ´æÎ»Öã¨Õâ¸ö²Ù×÷ÊÇ×Ô¶¯Í¸Ã÷µÄ£©¡£×îºó£¬µ÷ÕûÏÂÒ»¸ö¶ÔÏóÖ¸ÕëÀ´Ö¸ÏòÏÂÒ»¸ö¿ÉÓõÄÄÚ´æÎ»Öá£
ÏÂͼ²ûÃ÷ÁËÇå³ýºÍѹËõ¶ÑµÄ¹ý³Ì¡£

Àí½â¶ÔÏóµÄ´ú(object generations)
ÔÚ³¢ÊÔÕÒµ½²»¿É´ïµÄ¶ÔÏóʱ£¬CLR²¢²»ÊǼì²éÍйܶÑÉϵÄÿ¸ö¶ÔÏ󡣺ÜÃ÷ÏÔ£¬ÕâÑù×ö»áÏûºÄ´óÁ¿Ê±¼ä£¬ÓÈÆäÔÚ´óÐÍ£¨ÀýÈçÏÖʵÖУ©³ÌÐòÖС£
ΪÁ˰ïÖúÓÅ»¯Õâ¸ö¹ý³Ì£¬¶ÑÉϵÄÿ¸ö¶ÔÏó±»·ÖÅäµ½Ò»¸öÌØÊâµÄ"´ú¡±¡£´úÕâ¸ö¸ÅÄî±³ºóµÄÏë·¨ºÜ¼òµ¥£º¶ÔÏóÔÚ¶ÑÉÏ´æ»îµÄʱ¼äÔ½³¤£¬½ÓÏÂÀ´Ëü¼ÌÐø´æÔڵĿÉÄÜÐÔÒ²¾ÍÔ½´ó£¬¼´½Ï¾ÉµÄ¶ÔÏóÉú´æÆÚ³¤£¬½ÏеĶÔÏóÉú´æÆÚ¶Ì¡£ÀýÈ磬ʵÏÖMain()µÄ¶ÔÏóÒ»Ö±ÔÚÄÚ´æÖУ¬Ö±µ½³ÌÐò½áÊø¡£Ïà·´£¬×î½ü²Å±»·Åµ½¶ÑÖеĶÔÏó£¨ÀýÈçÔÚÒ»¸öº¯Êý·¶Î§Àï·ÖÅäµÄ¶ÔÏ󣩺ܿÉÄܺܿì¾Í²»¿É´ï¡£ÔÚ¶ÑÉϵÄÿ¸ö¶ÔÏóÊôÓÚÒÔϵÄijһ¸ö´ú£º
Generation 0£º ±êʶһ¸ö×î½ü·ÖÅäµÄ»¹Ã»Óб»±ê¼ÇΪ»ØÊյĶÔÏó Generation 1: ±êʶһ¸ö¾ÀúÁËÒ»´ÎÀ¬»ø»ØÊÕ¶ø´æ»îÏÂÀ´µÄ¶ÔÏó£¨ÀýÈ磬Ëû±»±ê¼ÇΪ»ØÊÕ£¬µ«ÓÉÓڶѿռ乻ÓöøÃ»Óб»Çå³ýµô£© Generation 2:±êʶһ¸ö¾ÀúÁ˲»Ö¹Ò»ÂÖÀ¬»ø»ØÊÕ¶ø´æ»îÏÂÀ´µÄ¶ÔÏó¡£ À¬»ø»ØÊÕÆ÷Ê×ÏÈ»á¼ì²égeneration 0µÄËùÓжÔÏó¡£Èç¹û±ê¼Ç²¢ÇåÀíÕâЩ¶ÔÏó£¨ÒëÕß×¢£ºÒòΪжÔÏóµÄÉú´æÆÚÍùÍù½Ï¶Ì£¬²¢ÇÒÆÚÍûÔÚÖ´ÐлØÊÕʱ£¬Ó¦ÓóÌÐò²»ÔÙʹÓõÚ
0 ¼¶ÍйܶÑÖеÄÐí¶à¶ÔÏ󣩺ó²úÉúÁË×㹻ʹÓõÄÄÚ´æ¿Õ¼ä£¬Èκδæ»îÏÂÀ´µÄ¶ÔÏó¾Í±»ÌáÉýµ½Generation
1¡£ÎªÁËÀí½âÒ»¸ö¶ÔÏóµÄ´úÈçºÎÓ°Ïì»ØÊյĹý³Ì£¬¿ÉÒԲ鿴ÏÂͼ¡£ÏÂͼ½âÊÍÁËgeneration 0ÖÐÒ»´ÎÀ¬»ø»ØÊպ󣬴æ»îµÄ¶ÔÏó±»ÌáÉýµÄ¹ý³Ì¡£¡¡¡¡

generation 0 ÖеĴæ»î¶ÔÏó±»ÌáÉýµ½generation 1
Èç¹ûËùÓеÄgeneration 0¶ÔÏó¶¼±»¼ì²éÁË£¬µ«ÊDzúÉúµÄÄÚ´æ¿Õ¼äÈÔÈ»²»¹»Ó㬾ͼì²éÒ»±égeneration
1ÖеÄËùÓжÔÏóµÄ¿É´ïÐÔ²¢»ØÊÕ¡£´æ»îÏÂÀ´µÄgeneration 1¶ÔÏó±»ÌáÉýµ½generation 2¡£Èç¹ûÀ¬»ø»ØÊÕÆ÷ÈÔÈ»ÐèÒª¶îÍâµÄÄڴ棬generation
2µÄ¶ÔÏó¾Í¾Àú¼ì²é²¢±»»ØÊÕ¡£´Ëʱ£¬Èç¹ûÒ»¸ögeneration 2µÄ¶ÔÏó´æ»îÏÂÀ´£¬ËüÈÔÈ»ÊÇÒ»¸ögeneration
2µÄ¶ÔÏó¡£
ͨ¹ý¸ø¶ÑÖеĶÔÏó¸³ÓèÒ»¸ögenerationµÄÖµ£¬Ð¶ÔÏ󣨱ÈÈç¾Ö²¿±äÁ¿£©»á±»ºÜ¿ì»ØÊÕ£¬¶øÀÏһЩµÄ¶ÔÏó£¨ÈçÒ»¸öÓ¦ÓóÌÐò¶ÔÏ󣩲»»á±»¾³£É§ÈÅ¡£ ΪÁ˽âÊÍÈçºÎÓÃSystem.GCÀàÀ´»ñµÃÀ¬»ø»ØÊÕµÄϸ½ÚÐÅÏ¢£¬¿¼ÂÇÏÂÃæµÄMainº¯Êý£¬ÀïÃæÓõ½ÁËһЩGCµÄ³ÉÔ±º¯Êý¡£
1 static void
Main (string[] args){
2 Console.WriteLine ("*****Fun with System.GC
*****");
3 //´òÓ¡³ö¶ÑÉÏÃæµÄ´óÖÂ×Ö½ÚÊý
4 Console.WriteLine ("Estimated bytes on
heap:{0}",
5 GC.GetTotalMemory(false));
6 //MaxGeneration»ùÓÚ0£¬ËùÒÔΪÁËÏÔʾ¶ø¼ÓÒ»
7 Console.WriteLine("This OS has{0} object
generations.\n"
8 (GC.MaxGeneration+1));
9 Car refToMyCar = new Car("Zippy",
100);
10 Console.WriteLine(refToMyCar.ToString());
11 //´òÓ¡³örefToMyCar¶ÔÏóµÄgeneration
12 Console.WriteLine ("Generation of refToMyCar
is:{0}",
13 GC.GetGeneration(refToMyCar));
14 Console.ReadLine();
15 }
16 |
Ç¿ÖÆ½øÐÐÒ»´ÎÀ¬»ø»ØÊÕ
.NET À¬»ø»ØÊÕÆ÷¾ÍÊÇÓÃÀ´×Ô¶¯¹ÜÀíÄÚ´æµÄ¡£µ«ÊÇ£¬ÔÚijЩ¼«¶ËÇé¿öÏ£¬Í¨¹ýʹÓÃGC.Collect()À´Ç¿ÖÆÒ»´ÎÀ¬»ø»ØÊÕÊÇÓÐÓõġ£ÓÈÆäÊÇ£º
ÄãµÄ³ÌÐò½«Òª½øÈëÒ»¶Î²»Ïë±»¿ÉÄܵÄÀ¬»ø»ØÊÕËùÖжϵĴúÂë¡£ ÄãµÄ³ÌÐò¸ÕÍê³É·ÖÅä´óÁ¿ÊýÄ¿µÄ¶ÔÏóµÄ¹ý³Ì£¬ÄãÏ뾡¿ÉÄÜÇåÀí³ö¸ü¶àÄÚ´æÀ´¡£ Èç¹ûÄã¾õµÃÈÃÀ¬»ø»ØÊÕÆ÷¼ì²é²»¿É´ïÄÚ´æÊÇÊ®·ÖÓбØÒªµÄ£¬ÄãÏñÈçÏ´úÂëÒ»ÑùÏÔʾ´¥·¢Ò»´ÎÀ¬»ø»ØÊÕ£º
1 static void
Main(string[] args){
2 //Ç¿ÖÆÒ»´ÎÀ¬»ø»ØÊÕ²¢µÈ´ýÿ¸ö¶ÔÏó±»Öսᡣ
3 GC.Collect();
4 GC.WaitForPendingFinalizers();
5 } |
µ±ÄãÊÖ¶¯Ç¿ÖÆÖ´ÐÐÒ»´ÎÀ¬»ø»ØÊÕ£¬ÄãÓ¦¸Ãµ÷ÓÃGC.WaitForPendingFinalizers()¡£ÀûÓÃÕâ¸öº¯Êý£¬Äã¿ÉÒÔÈ·±£ËùÓеĵȴý±»ÖÕ½áµÄ¶ÔÏóÔÚÄãµÄ³ÌÐò¼ÌÐøÍùÏÂÖ´ÐÐ֮ǰӵÓлú»áÖ´ÐÐһЩËùÐèµÄÇåÀí¹¤×÷¡£GC.WaitForPendingFinalizers£¨£©»áÔÚÇåÀíÆÚ¼ä¹ÒÆðµ÷ÓÃËüµÄÏ̡߳£ÕâÊÇÒ»¸öºÃÊ£¬ËüÈ·±£ÄãµÄ´úÂë²»»áÔÚµ±Ç°ÕýÒª±»Ïú»ÙµÄ¶ÔÏóÉϵ÷Óú¯Êý¡£
GC.Collectº¯Êý½ÓÊÕÒ»¸öÊý×Ö²ÎÊýÀ´±êʶÔÚÄĸögenerationÉÏÖ´ÐÐÀ¬»ø»ØÊÕ¡£ÀýÈ磬Èç¹ûÄãÏëÈÃCLRÖ»¼ì²égeneration
0ÉϵĶÔÏó£¬ÄãÐèÒªÕâÑùд£º
1 static void
Main(string[] args){
2 //Ö»¼ì²égeneration 0ÉϵĶÔÏó
3 GC.Collect(0);
4 GC.WaitForPendingFinializers();
5 } |
.Net 3.5ÖУ¬Collectº¯Êý¿ÉÒÔ´«ÈëÒ»¸öֵΪGCCollectionModeµÄö¾ÙÀàÐÍ×÷ΪµÚ¶þ¸ö²ÎÊý£¬À´¾«È·¶¨ÒåÖ´Ðл·¾³ÈçºÎÖ´ÐÐÀ¬»ø»ØÊÕ¡£Õâ¸öö¾Ù¶¨ÒåÁËÈçϵÄÖµ£º
1 public enum
GCCollectionMode{
2 Default,//ForedÊǵ±Ç°µÄĬÈÏÖµ
3 Forced,//¸æËßÖ´Ðл·¾³Á¢¼´Ö´ÐлØÊÕ
4 Optimized //ÈÃÔËÐл·¾³À´¾ö¶¨µ±Ç°Ê±¼äÊÇ·ñÊÇÇåÀí¶ÔÏóµÄ×î¼Ñʱ¼ä
5 } |
ÏñÆäËûµÄÀ¬»ø»ØÊÕÒ»Ñù£¬µ÷ÓÃGC.Collect()»áÌáÉý´æ»îÏÂÀ´µÄ¶ÔÏó¡£¼ÙÉèMainº¯Êý´úÂë¸üÐÂÈçÏ£º
1 static void
Main(string[] args)
2 {
3 Console.WriteLine ("***** Fun with System.GC
*****");
4 //´òÓ¡³ö¶ÑÉϵĴóÖÂ×Ö½ÚÊý
5 Console.WriteLine ("Estimated bytes on
heap:{0}", GC.GetTotalMemory(false));
6 //MaxGeneration»ùÊýΪ0.
7 Console.WriteLine("This OS has {0} object
generations.\n", (GC.MaxGeneration+1));
8 Car refToMyCar = new Car("Zippy",
100);
9 Console.WriteLine (refToMyCar.ToString());
10 //Print out generation of refToMyCar.
11 Console.WriteLine ("\nGeneration of refToMyCar
is:{0}", GC.GetGeneration(refOfMyCr));
12 //ΪÁ˲âÊÔ´´½¨´óÁ¿¶ÔÏó
13 object[] tonsOfObjects = new object[50000];
14 for(int i=0;i<50000;i++)
15 tonsOfObjects[i] = new object();
16 //Ö»»ØÊÕgen0µÄ¶ÔÏó
17 GC.Collect(0, GCCollectionMode.Forced);
18 GC.WaitForPendingFinalizers();
19 //´òÓ¡³örefToMyCarµÄgeneration
20 Console.WriteLine ("Generation of refToMyCar
is:{0}", GC.GetGeneration(refToMyCar));
21 //²é¿´tonsOfObjects[9000] ÊÇ·ñ»¹´æ»î×Å
22 if(tonsOfObjects[9000]!=null)
23 {
24 Console.WriteLine ("Generation of tonsOfObjects[9000]
is :{0}", GC.GetGeneration(tonsOfObjects[9000]));
25 }
26 else
27 Console.WriteLine ("tonsOfObjects[9000]
is no longer alive.");
28 //´òÓ¡³öÿ¸öGeneration¾ÀúÁ˶àÉٴλØÊÕ
29 Console.WriteLine ("\nGen 0 has been swept
{0} times", GC.CollectionCount(0));
30 Console.WriteLine ("Gen 1 has been swept
{0} times", GC.CollectionCount(1));
31 Console.WriteLine("Gen 2 has been swept
{0} times", GC.CollectionCount(2));
32 Console.ReadLine();
33 }
34 |
ÕâÀÎÒÃÇΪÁ˲âÊÔÄ¿µÄÓÐÒâµÄ´´½¨ÁËÒ»¸ö·Ç³£´óµÄ¶ÔÏóÊý×飨50,000¸ö£©¡£Äã¿ÉÒÔ´ÓÏÂͼÖп´µ½Êä³ö£¬¾¡¹ÜÕâ¸öMain()º¯ÊýÖ»ÏÔʾµ÷ÓÃÁËÒ»´ÎÀ¬»ø»ØÊÕ£¨Í¨¹ýGC.Collect()º¯Êý),
µ«CLR ÔÚÄ»ºóÖ´ÐÐÁ˶à´ÎÀ¬»ø»ØÊÕ¡£¡¡¡¡

|