.Net À¬»ø»ØÊÕ»úÖÆÔÀíºÍËã·¨£¨Ò»£©
ÓÐÁËMicrosoft.Net clrÖеÄÀ¬»ø»ØÊÕ»úÖÆ³ÌÐòÔ±²»ÐèÒªÔÙ¹Ø×¢Ê²Ã´Ê±ºòÊÍ·ÅÄڴ棬ÊÍ·ÅÄÚ´æÕâ¼þʶùÍêÈ«ÓÉGC×öÁË£¬¶Ô³ÌÐòÔ±À´ËµÊÇ͸Ã÷µÄ¡£¾¡¹ÜÈç´Ë£¬×÷Ϊһ¸ö.Net³ÌÐòÔ±ºÜÓбØÒªÀí½âÀ¬»ø»ØÊÕÊÇÈçºÎ¹¤×÷µÄ¡£ÕâÆªÎÄÕÂÎÒÃǾÍÀ´¿´ÏÂ.NetÊÇÈçºÎ·ÖÅäºÍ¹ÜÀíÍйÜÄÚ´æµÄ£¬Ö®ºóÔÙÒ»²½Ò»²½ÃèÊöÀ¬»ø»ØÊÕÆ÷¹¤×÷µÄËã·¨»úÖÆ¡£
Ϊ³ÌÐòÉè¼ÆÒ»¸öÊʵ±µÄÄÚ´æ¹ÜÀí²ßÂÔÊÇÀ§ÄѵÄÒ²ÊÇ·¦Î¶µÄ£¬Õâ¸ö¹¤×÷»¹»áÓ°ÏìÄãרעÓÚ½â¾ö³ÌÐò±¾ÉíÒª½â¾öµÄÎÊÌâ¡£ÓÐûÓÐÒ»ÖÖÄÚÖõķ½·¨¿ÉÒÔ°ïÖú¿ª·¢ÈËÔ±½â¾öÄÚ´æ¹ÜÀíµÄÎÊÌâÄØ£¿µ±È»ÓÐÁË£¬ÔÚ.NetÖоÍÊÇGC£¬À¬»ø»ØÊÕ¡£
ÈÃÎÒÃÇÏëһϣ¬Ã¿Ò»¸ö³ÌÐò¶¼ÒªÊ¹ÓÃÄÚ´æ×ÊÔ´£ºÀýÈçÆÁÄ»ÏÔʾ£¬ÍøÂçÁ¬½Ó£¬Êý¾Ý¿â×ÊÔ´µÈµÈ¡£Êµ¼ÊÉÏ£¬ÔÚÒ»¸öÃæÏò¶ÔÏó»·¾³ÖУ¬Ã¿Ò»ÖÖÀàÐͶ¼ÐèÒªÕ¼ÓÃÒ»µãÄÚ´æ×ÊÔ´À´´æ·ÅËûµÄÊý¾Ý£¬¶ÔÏóÐèÒª°´ÕÕÈçϵIJ½ÖèʹÓÃÄڴ棺
1. ΪÀàÐÍ·ÖÅäÄÚ´æ¿Õ¼ä
2. ³õʼ»¯Äڴ棬½«ÄÚ´æÉèÖÃΪ¿ÉÓÃ״̬
3. ´æÈ¡¶ÔÏóµÄ³ÉÔ±
4. Ïú»Ù¶ÔÏó£¬Ê¹ÄÚ´æ±ä³ÉÇå¿Õ״̬
5. ÊÍ·ÅÄÚ´æ
ÕâÖÖÃ²ËÆ¼òµ¥µÄÄÚ´æÊ¹ÓÃģʽµ¼Ö¹ýºÜ¶àµÄ³ÌÐòÎÊÌ⣬ÓÐʱºò³ÌÐòÔ±¿ÉÄÜ»áÍü¼ÇÊͷŲ»ÔÙʹÓõĶÔÏó£¬ÓÐʱºòÓÖ»áÊÔͼ·ÃÎÊÒѾÊͷŵĶÔÏó¡£ÕâÁ½ÖÖbugͨ³£¶¼ÓÐÒ»¶¨µÄÒþ²ØÐÔ£¬²»ÈÝÒ×·¢ÏÖ£¬ËûÃDz»ÏñÂß¼´íÎ󣬷¢ÏÖÁ˾ͿÉÒÔÐ޸ĵô¡£ËûÃÇ¿ÉÄÜ»áÔÚ³ÌÐòÔËÐÐÒ»¶Îʱ¼äÖ®ºóÄÚ´æÐ¹Â©µ¼ÖÂÒâÍâµÄ±ÀÀ£¡£ÊÂʵÉÏ£¬Óкܶ๤¾ß¿ÉÒÔ°ïÖú¿ª·¢ÈËÔ±¼ì²âÄÚ´æÎÊÌ⣬±ÈÈ磺ÈÎÎñ¹ÜÀíÆ÷£¬System Monitor AcitvieX Control, ÒÔ¼°RationalµÄPurify¡£
¶øGC¿ÉÒÔÍêÈ«²»ÐèÒª¿ª·¢ÈËԱȥ¹Ø×¢Ê²Ã´Ê±ºòÊÍ·ÅÄڴ档Ȼ¶ø£¬À¬»ø»ØÊÕÆ÷²¢²»ÊÇ¿ÉÒÔ¹ÜÀíÄÚ´æÖеÄËùÓÐ×ÊÔ´¡£ÓÐЩ×ÊÔ´À¬»ø»ØÊÕÆ÷²»ÖªµÀ¸ÃÈçºÎ»ØÊÕËûÃÇ£¬Õⲿ·Ö×ÊÔ´¾ÍÐèÒª¿ª·¢ÈËÔ±×Ô¼ºÐ´´úÂëʵÏÖ»ØÊÕ¡£ÔÚ.Net frameworkÖУ¬¿ª·¢ÈËԱͨ³£»á°ÑÇåÀíÕâÀà×ÊÔ´µÄ´úÂëдµ½Close¡¢Dispose»òÕßFinalize·½·¨ÖУ¬ÉÔºóÎÒÃǻῴÏÂFinalize·½·¨£¬Õâ¸ö·½·¨À¬»ø»ØÊÕÆ÷»á×Ô¶¯µ÷Óá£
²»¹ý£¬Óкܶà¶ÔÏóÊDz»ÐèÒª×Ô¼ºÊµÏÖÊÍ·Å×ÊÔ´µÄ´úÂëµÄ£¬±ÈÈ磺Rectangle£¬Çå¿ÕËüÖ»ÐèÒªÇå¿ÕËüµÄleft£¬right£¬width£¬height×ֶξͿÉÒÔÁË£¬ÕâÀ¬»ø»ØÊÕÆ÷ÍêÈ«¿ÉÒÔ×ö¡£ÏÂÃæÈÃÎÒÃÇÀ´¿´ÏÂÄÚ´æÊÇÈçºÎ·ÖÅ䏸¶ÔÏóʹÓõġ£
¶ÔÏó·ÖÅ䣺
.Net clr°ÑËùÓеÄÒýÓöÔÏó¶¼·ÖÅäµ½ÍйܶÑÉÏ¡£ÕâÒ»µãºÜÏñc-runtime¶Ñ£¬²»¹ýÄã²»ÐèÒª¹Ø×¢Ê²Ã´Ê±ºòÊͷŶÔÏ󣬶ÔÏó»áÔÚ²»ÓÃʱ×Ô¶¯ÊÍ·Å¡£ÕâÑù£¬¾Í³öÏÖÒ»¸öÎÊÌ⣬À¬»ø»ØÊÕÆ÷ÊÇÔõô֪µÀÒ»¸ö¶ÔÏó²»ÔÙʹÓøûØÊÕÁËÄØ£¿ÎÒÃÇÉÔºó½âÊÍÕâ¸öÎÊÌâ¡£
ÏÖÔÚÓм¸ÖÖÀ¬»ø»ØÊÕËã·¨£¬Ã¿Ò»ÖÖËã·¨¶¼ÎªÒ»ÖÖÌØ¶¨µÄ»·¾³×öÁËÐÔÄÜÓÅ»¯£¬ÕâÆªÎÄÕÂÎÒÃǹØ×¢µÄÊÇclrµÄÀ¬»ø»ØÊÕËã·¨¡£ÈÃÎÒÃÇ´ÓÒ»¸ö»ù´¡¸ÅÄî̸Æð¡£
µ±Ò»¸ö½ø³Ì³õʼ»¯Ö®ºó£¬ÔËÐÐʱ»á±£ÁôÒ»¶ÎÁ¬ÐøµÄ¿Õ°×ÄÚ´æ¿Õ¼ä£¬Õâ¿éÄÚ´æ¿Õ¼ä¾ÍÊÇÍйܶѡ£Íйܶѻá¼Ç¼һ¸öÖ¸Õ룬ÎÒÃǽÐËüNextObjPtr£¬Õâ¸öÖ¸ÕëÖ¸ÏòÏÂÒ»¸ö¶ÔÏóµÄ·ÖÅ䵨ַ£¬×î³õµÄʱºò£¬Õâ¸öÖ¸ÕëÖ¸ÏòÍÐ¹Ü¶ÑµÄÆðʼλÖá£
Ó¦ÓóÌÐòʹÓÃnew²Ù×÷·û´´½¨Ò»¸öжÔÏó£¬Õâ¸ö²Ù×÷·ûÊ×ÏÈҪȷÈÏÍйܶÑÊ£Óà¿Õ¼äÄܷŵÃÏÂÕâ¸ö¶ÔÏó£¬Èç¹ûÄܷŵÃÏ£¬¾Í°ÑNextObjPtrÖ¸ÕëÖ¸ÏòÕâ¸ö¶ÔÏó£¬È»ºóµ÷ÓöÔÏóµÄ¹¹Ô캯Êý£¬new²Ù×÷·û·µ»Ø¶ÔÏóµÄµØÖ·¡£
ͼ1ÍйܶÑ
Õâʱºò£¬NextObjPtrÖ¸ÏòÍйܶÑÉÏÏÂÒ»¸ö¶ÔÏó·ÖÅäµÄλÖã¬Í¼1ÏÔʾһ¸öÍйܶÑÖÐÓÐÈý¸ö¶ÔÏóA¡¢BºÍC¡£ÏÂÒ»¸ö¶ÔÏó»á·ÅÔÚNextObjPtrÖ¸ÏòµÄλÖ㨽ô°¤×ÅC¶ÔÏó£©
ÏÖÔÚÈÃÎÒÃÇÔÙ¿´Ò»ÏÂc-runtime¶ÑÈçºÎ·ÖÅäÄÚ´æ¡£ÔÚc-runtime¶Ñ£¬·ÖÅäÄÚ´æÐèÒª±éÀúÒ»¸öÁ´±íµÄÊý¾Ý½á¹¹£¬Ö±µ½ÕÒµ½Ò»¸ö×ã¹»´óµÄÄÚ´æ¿é£¬Õâ¸öÄÚ´æ¿éÓпÉÄܻᱻ²ð·Ö£¬²ð·ÖºóÁ´±íÖеÄÖ¸ÕëÒªÖ¸ÏòÊ£ÓàÄÚ´æ¿Õ¼ä£¬ÒªÈ·±£Á´±íµÄÍêºÃ¡£¶ÔÓÚÍйܶѣ¬·ÖÅäÒ»¸ö¶ÔÏóÖ»ÊÇÐÞ¸ÄNextObjPtrÖ¸ÕëµÄÖ¸Ïò£¬Õâ¸öËÙ¶ÈÊǷdz£¿ìµÄ¡£ÊÂʵÉÏ£¬ÔÚÍйܶÑÉÏ·ÖÅäÒ»¸ö¶ÔÏóºÍÔÚÏß³ÌÕ»ÉÏ·ÖÅäÄÚ´æµÄËٶȺܽӽü¡£
µ½Ä¿Ç°ÎªÖ¹£¬ÍйܶÑÉÏ·ÖÅäÄÚ´æµÄËÙ¶ÈËÆºõ±ÈÔÚc-runtime¶ÑÉϵĸü¿ì£¬ÊµÏÖÉÏÒ²¸ü¼òµ¥Ò»Ð©¡£µ±È»£¬ÍйܶѻñµÃÕâ¸öÓÅÊÆÊÇÒòΪ×öÁËÒ»¸ö¼ÙÉ裺µØÖ·¿Õ¼äÊÇÎÞÏ޵ġ£ºÜÏÔÈ»Õâ¸ö¼ÙÉèÊÇ´íÎóµÄ¡£±ØÐëÓÐÒ»ÖÖ»úÖÆ±£Ö¤Õâ¸ö¼ÙÉè³ÉÁ¢¡£Õâ¸ö»úÖÆ¾ÍÊÇÀ¬»ø»ØÊÕÆ÷¡£ÈÃÎÒÃÇ¿´ÏÂËüÈçºÎ¹¤×÷¡£
µ±Ó¦ÓóÌÐòµ÷ÓÃnew²Ù×÷·û´´½¨¶ÔÏóʱ£¬ÓпÉÄÜÒѾûÓÐÄÚ´æÀ´´æ·ÅÕâ¸ö¶ÔÏóÁË¡£ÍйܶѿÉÒÔ¼ì²âµ½NextObjPtrÖ¸ÏòµÄ¿Õ¼äÊÇ·ñ³¬¹ýÁ˶ѵĴóС£¬Èç¹û³¬¹ýÁ˾Í˵Ã÷ÍйܶÑÂúÁË£¬¾ÍÐèÒª×öÒ»´ÎÀ¬»ø»ØÊÕÁË¡£
ÔÚÏÖʵÖУ¬ÔÚ0´ú¶ÑÂúÁËÖ®ºó¾Í»á´¥·¢Ò»´ÎÀ¬»ø»ØÊÕ¡£¡°´ú¡±ÊÇÀ¬»ø»ØÊÕÆ÷ÌáÉýÐÔÄܵÄÒ»ÖÖʵÏÖ»úÖÆ¡£¡°´ú¡±µÄÒâ˼ÊÇ£ºÐ´´½¨µÄ¶ÔÏóÊÇÄêÇáÒ»´ú£¬¶øÔÚ»ØÊÕ²Ù×÷·¢Éú֮ǰûÓб»»ØÊÕµôµÄ¶ÔÏóÊǽÏÀϵĶÔÏó¡£½«¶ÔÏó·Ö³É¼¸´ú¿ÉÒÔÔÊÐíÀ¬»ø»ØÊÕÆ÷Ö»»ØÊÕijһ´úµÄ¶ÔÏ󣬶ø²»ÊÇ»ØÊÕËùÓжÔÏó¡£
À¬»ø»ØÊÕËã·¨£º
À¬»ø»ØÊÕÆ÷¼ì²é¿´ÊÇ·ñ´æÔÚÓ¦ÓóÌÐò²»ÔÙʹÓõĶÔÏó¡£Èç¹ûÕâÑùµÄ¶ÔÏó´æÔÚ£¬ÄÇôÕâЩ¶ÔÏóÕ¼ÓõĿռä¾Í¿ÉÒÔ±»»ØÊÕ£¨Èç¹û¶ÑÉÏûÓÐ×ã¹»µÄÄÚ´æ¿ÉÓã¬ÄÇônew²Ù×÷·û¾Í»áÅ׳öOutofMemoryException£©¡£Äã¿ÉÄÜ»áÎÊÀ¬»ø»ØÊÕÆ÷ÊÇÔõÑùÅжÏÒ»¸ö¶ÔÏóÊÇ·ñ»¹ÔÚÓÃÄØ£¿Õâ¸öÎÊÌⲻ̫ÈÝÒ׵õ½´ð°¸¡£
ÿ¸öÓ¦ÓóÌÐò¶¼ÓÐÒ»×é¸ù¶ÔÏ󣬸ùÊÇһЩ´æ´¢Î»Öã¬ËûÃÇ¿ÉÄÜÖ¸ÏòÍйܶÑÉϵÄij¸öµØÖ·£¬Ò²¿ÉÄÜÊÇnull¡£ÀýÈ磬ËùÓеÄÈ«¾ÖºÍ¾²Ì¬¶ÔÏóÖ¸ÕëÊÇÓ¦ÓóÌÐòµÄ¸ù¶ÔÏó£¬ÁíÍâÔÚÏß³ÌÕ»Éϵľֲ¿±äÁ¿/²ÎÊýÒ²ÊÇÓ¦ÓóÌÐòµÄ¸ù¶ÔÏ󣬻¹ÓÐCPU¼Ä´æÆ÷ÖеÄÖ¸ÏòÍйܶѵĶÔÏóÒ²ÊǸù¶ÔÏó¡£´æ»îµÄ¸ù¶ÔÏóÁбíÓÉJIT£¨just-in-time£©±àÒëÆ÷ºÍclrά»¤£¬À¬»ø»ØÊÕÆ÷¿ÉÒÔ·ÃÎÊÕâЩ¸ù¶ÔÏóµÄ¡£
µ±À¬»ø»ØÊÕÆ÷¿ªÊ¼ÔËÐУ¬Ëü»á¼ÙÉèÍйܶÑÉϵÄËùÓжÔÏó¶¼ÊÇÀ¬»ø¡£Ò²¾ÍÊÇ˵£¬¼Ù¶¨Ã»Óиù¶ÔÏó£¬Ò²Ã»Óиù¶ÔÏóÒýÓõĶÔÏó¡£È»ºóÀ¬»ø»ØÊÕÆ÷¿ªÊ¼±éÀú¸ù¶ÔÏó²¢¹¹½¨Ò»¸öÓÉËùÓк͸ù¶ÔÏóÖ®¼äÓÐÒýÓùØÏµ¶ÔÏ󹹳ɵÄͼ¡£
ͼ2ÏÔʾ£¬ÍйܶÑÉÏÓ¦ÓóÌÐòµÄ¸ù¶ÔÏóÊÇA£¬C£¬DºÍF£¬Õ⼸¸ö¶ÔÏó¾ÍÊÇͼµÄÒ»²¿·Ö£¬È»ºó¶ÔÏóDÒýÓÃÁ˶ÔÏóH£¬ÄÇô¶ÔÏóHÒ²±»Ìí¼Óµ½Í¼ÖУ»À¬»ø»ØÊÕÆ÷»áÑ»·±éÀúËùÓпɴï¶ÔÏó¡£
ͼ2 ÍйܶÑÉϵĶÔÏó
À¬»ø»ØÊÕÆ÷»á°¤¸ö±éÀú¸ù¶ÔÏóºÍÒýÓöÔÏó¡£Èç¹ûÀ¬»ø»ØÊÕÆ÷·¢ÏÖÒ»¸ö¶ÔÏóÒѾÔÚͼÖоͻỻһ¸ö·¾¶¼ÌÐø±éÀú¡£ÕâÑù×öÓÐÁ½¸öÄ¿µÄ£ºÒ»ÊÇÌá¸ßÐÔÄÜ£¬¶þÊDZÜÃâÎÞÏÞÑ»·¡£
ËùÓеĸù¶ÔÏó¶¼¼ì²éÍêÖ®ºó£¬À¬»ø»ØÊÕÆ÷µÄͼÖоÍÓÐÁËÓ¦ÓóÌÐòÖÐËùÓеĿɴï¶ÔÏó¡£ÍйܶÑÉÏËùÓв»ÔÚÕâ¸öͼÉϵĶÔÏó¾ÍÊÇÒª×ö»ØÊÕµÄÀ¬»ø¶ÔÏóÁË¡£¹¹½¨ºÃ¿É´ï¶ÔÏóͼ֮ºóÀ¬»ø»ØÊÕÆ÷¿ªÊ¼ÏßÐԵıéÀúÍйܶѣ¬ÕÒµ½Á¬ÐøÀ¬»ø¶ÔÏó¿é£¨¿ÉÒÔÈÏΪÊÇ¿ÕÏÐÄڴ棩¡£È»ºóÀ¬»ø»ØÊÕÆ÷½«·ÇÀ¬»ø¶ÔÏóÒÆ¶¯µ½Ò»Æð£¨Ê¹ÓÃcÓïÑÔÖеÄmemcpyº¯Êý£©£¬¸²¸ÇËùÓеÄÄÚ´æË鯬¡£µ±È»£¬Òƶ¯¶ÔÏóʱҪ½ûÓÃËùÓжÔÏóµÄÖ¸Õ루ÒòΪËûÃǶ¼¿ÉÄÜÊÇ´íÎóµÄÁË£©¡£Òò´ËÀ¬»ø»ØÊÕÆ÷±ØÐëÐÞ¸ÄÓ¦ÓóÌÐòµÄ¸ù¶ÔÏóʹËûÃÇÖ¸Ïò¶ÔÏóµÄÐÂÄÚ´æµØÖ·¡£´ËÍ⣬Èç¹ûij¸ö¶ÔÏó°üº¬ÁíÒ»¸ö¶ÔÏóµÄÖ¸Õ룬À¬»ø»ØÊÕÆ÷Ò²Òª¸ºÔðÐÞ¸ÄÒýÓá£Í¼3ÏÔʾÁËÒ»´Î»ØÊÕÖ®ºóµÄÍйܶѡ£
ͼ3 »ØÊÕÖ®ºóµÄÍйܶÑ
Èçͼ3ËùʾÔÚ»ØÊÕÖ®ºó£¬ËùÓеÄÀ¬»ø¶ÔÏó¶¼±»±êʶ³öÀ´£¬¶øËùÓеķÇÀ¬»ø¶ÔÏó±»Òƶ¯µ½Ò»Æð¡£ËùÓеķÇÀ¬»ø¶ÔÏóµÄÖ¸ÕëÒ²±»Ð޸ijÉÒÆ¶¯ºóµÄÄÚ´æµØÖ·£¬NextObjPtrÖ¸Ïò×îºóÒ»¸ö·ÇÀ¬»ø¶ÔÏóµÄºóÃæ¡£Õâʱºònew²Ù×÷·û¾Í¿ÉÒÔ¼ÌÐø³É¹¦µÄ´´½¨¶ÔÏóÁË¡£
ÈçÄã¿´µ½µÄ£¬À¬»ø»ØÊÕ»áÓÐÏÔÖøµÄÐÔÄÜËðʧ£¬ÕâÊÇʹÓÃÍйܶѵÄÒ»¸öÃ÷ÏÔµÄȱµã¡£ ²»¹ý£¬Òª¼Ç×ÅÄÚ´æ»ØÊÕ²Ù×÷Ö¼ÔÚÍйܶÑÂýÁËÖ®ºó²Å»áÖ´ÐС£ÔÚÂú֮ǰÍйܶѵÄÐÔÄܱÈc-runtime¶ÑµÄÐÔÄܺÃÒªºÃ¡£ÔËÐÐʱÀ¬»ø»ØÊÕÆ÷»¹»á×öһЩÐÔÄÜÓÅ»¯£¬ÎÒÃÇÔÚÏÂһƪÎÄÕÂÖÐ̸ÂÛÕâ¸ö¡£
ÏÂÃæµÄ´úÂë˵Ã÷Á˶ÔÏóÊÇÈçºÎ±»´´½¨¹ÜÀíµÄ£º
class Application { public static int Main(String[] args) { // ArrayList object created in heap, myArray is now a root ArrayList myArray = new ArrayList(); // Create 10000 objects in the heap for (int x = 0; x < 10000; x++) { myArray.Add(new Object()); // Object object created in heap } // Right now, myArray is a root (on the thread's stack). So, // myArray is reachable and the 10000 objects it points to are also // reachable. Console.WriteLine(a.Length); // After the last reference to myArray in the code, myArray is not // a root. // Note that the method doesn't have to return, the JIT compiler // knows // to make myArray not a root after the last reference to it in the // code. // Since myArray is not a root, all 10001 objects are not reachable // and are considered garbage. However, the objects are not // collected until a GC is performed. } }
Ò²ÐíÄã»áÎÊ£¬GCÕâôºÃ£¬ÎªÊ²Ã´ANSI C++ÖÐûÓÐËüÄØ£¿ ÔÒòÊÇÀ¬»ø»ØÊÕÆ÷±ØÐëÄÜÕÒµ½Ó¦ÓóÌÐòµÄ¸ù¶ÔÏóÁÐ±í£¬±ØÐëÕÒµ½¶ÔÏóµÄÖ¸Õë¡£¶øÔÚC++ÖжÔÏóµÄÖ¸ÕëÖ®¼äÊÇ¿ÉÒÔÏ໥ת»»µÄ£¬Ã»Óа취֪µÀÖ¸ÕëÖ¸ÏòµÄÊÇÒ»¸öʲô¶ÔÏóµÄÖ¸Õë¡£ÔÚCLRÖУ¬ÍйܶÑÖªµÀ¶ÔÏóµÄʵ¼ÊÀàÐÍ¡£¶øÔªÊý¾Ý£¨metadata£©ÐÅÏ¢¿ÉÒÔÓÃÀ´Åж϶ÔÏóÒýÓÃÁËʲô³ÉÔ±¶ÔÏó¡£
À¬»ø»ØÊÕºÍFinalization
À¬»ø»ØÊÕÆ÷ÌṩÁËÒ»¸ö¶îÍâµÄ¹¦ÄÜ£¬Ëü¿ÉÒÔÔÚ¶ÔÏó±»±êʶΪÀ¬»øºó×Ô¶¯µ÷ÓÃÆäFinalize·½·¨£¨Ç°ÌáÊǶÔÏóÖØÐ´ÁËobjectµÄFinalize·½·¨£©¡£
Finalize·½·¨ÊÇobject¶ÔÏóµÄÒ»¸öÐé·½·¨£¬Èç¹ûÐèÒªÄã¿ÉÒÔÖØÐ´Õâ¸ö·½·¨£¬µ«ÊÇÕâ¸ö·½·¨Ö»ÄÜͨ¹ýÀàËÆc++Îö¹¹º¯ÊýµÄ·½Ê½ÖØÐ´¡£ÀýÈ磺
class Foo { ~Foo(){ Console.WriteLine(¡°Foo Finalize¡±); } }
ÕâÀïÓùýC++µÄ³ÌÐòÔ±ÒªÌØ±ð×¢Ò⣬Finalize·½·¨µÄд·¨ºÍC++µÄÎö¹¹º¯ÊýÍêȫһÑù£¬µ«ÊÇ£¬.Net ÖеÄFinalize·½·¨ºÍÎö¹¹º¯ÊýµÄÈ´ÊDz»Ò»ÑùµÄ£¬ÍйܶÔÏóÊDz»Äܱ»Îö¹¹µÄ£¬Ö»ÄÜͨ¹ýÀ¬»ø»ØÊÕ»ØÊÕ¡£
µ±ÄãÉè¼ÆÒ»¸öÀàʱ£¬×îºÃ±ÜÃâÖØÐ´Finalize·½·¨£¬ÔÒòÈçÏ£º
1. ʵÏÖFinalizeµÄ¶ÔÏó»á±»ÌáÉýµ½¸üÀϵġ°´ú¡±£¬Õâ»áÔö¼ÓÄÚ´æÑ¹Á¦£¬Ê¹¶ÔÏóºÍ´Ë¶ÔÏóµÄ¹ØÁª¶ÔÏó²»ÄÜÔÚ³ÉΪÀ¬»øµÄµÚһʱ¼ä»ØÊÕµô¡£
2. ÕâЩ¶ÔÏó·ÖÅäʱ¼ä»á¸ü³¤
3. ÈÃÀ¬»ø»ØÊÕÆ÷Ö´ÐÐFinalize·½·¨»áÃ÷ÏÔµÄËðºÄÐÔÄÜ¡£Çë¼Çס£¬Ã¿Ò»¸öʵÏÖÁËFinalize·½·¨µÄ¶ÔÏó¶¼ÐèÒªÖ´ÐÐFinalize·½·¨£¬Èç¹ûÓÐÒ»¸ö³¤¶ÈΪ10000µÄÊý×é¶ÔÏó£¬Ã¿¸ö¶ÔÏó¶¼ÐèÒªÖ´ÐÐFinalize·½·¨
4. ÖØÐ´Finalize·½·¨µÄ¶ÔÏó¿ÉÄÜ»á ÒýÓÃÆäËûûÓÐʵÏÖFinalize·½·¨µÄ¶ÔÏó£¬ÕâЩ¶ÔÏóÒ²»áÑÓ³Ù»ØÊÕ
5. ÄãûÓа취¿ØÖÆÊ²Ã´Ê±ºòÖ´ÐÐFinalize·½·¨¡£Èç¹ûÒªÔÚFinalize·½·¨ÖÐÊÍ·ÅÀàËÆÊý¾Ý¿âÁ¬½ÓÖ®ÀàµÄ×ÊÔ´£¬¾ÍÓпÉÄܵ¼ÖÂÊý¾Ý¿â×ÊÔ´ÔÚʱºòºóºÜ¾Ã²ÅµÃÒÔÊÍ·Å
6. µ±³ÌÐò±ÀÀ£Ê±£¬Ò»Ð©¶ÔÏó»¹±»ÒýÓã¬ËûÃǵÄFinalize·½·¨¾ÍûÓлú»áÖ´ÐÐÁË¡£ÕâÖÖÇé¿ö»áÔÚºǫ́Ïß³ÌʹÓöÔÏ󣬻òÕß¶ÔÏóÔÚ³ÌÐòÍ˳öʱ£¬»òÕßAppDomainÐ¶ÔØÊ±¡£ÁíÍ⣬ĬÈÏÇé¿öÏ£¬µ±Ó¦ÓóÌÐò±»Ç¿ÖƽáÊøÊ±Finalize·½·¨Ò²²»»áÖ´ÐС£µ±È»ËùÓеIJÙ×÷ϵͳ×ÊÔ´»á±»»ØÊÕ£»µ«ÊÇÔÚÍйܶÑÉϵĶÔÏó²»»á»ØÊÕ¡£Äã¿ÉÒÔͨ¹ýµ÷ÓÃGCµÄRequestFinalizeOnShutdown·½·¨¸Ä±äÕâÖÖÐÐΪ¡£
7. ÔËÐÐʱ²»ÄÜ¿ØÖƶà¸ö¶ÔÏóFinalize·½·¨Ö´ÐеÄ˳Ðò¡£¶øÓÐʱºò¶ÔÏóµÄÏú»Ù¿ÉÄÜÓÐ˳ÐòÐÔ
Èç¹ûÄ㶨ÒåµÄ¶ÔÏó±ØÐëʵÏÖFinalize·½·¨£¬ÄÇôҪȷ±£Finalize·½·¨¾¡¿ÉÄÜ¿ìµÄÖ´ÐУ¬Òª±ÜÃâËùÓпÉÄÜÒýÆð×èÈûµÄ²Ù×÷£¬°üÀ¨ÈκÎÏß³Ìͬ²½²Ù×÷¡£ÁíÍ⣬Ҫȷ±£Finalize·½·¨²»»áÒýÆðÈκÎÒì³££¬Èç¹ûÓÐÒì³£À¬»ø»ØÊÕÆ÷»á¼ÌÐøÖ´ÐÐÆäËû¶ÔÏóµÄFinalize·½·¨Ö±½ÓºöÂÔµôÒì³£¡£
µ±±àÒëÆ÷Éú³É´úÂëʱ»á×Ô¶¯ÔÚ¹¹Ô캯ÊýÉϵ÷ÓûùÀàµÄ¹¹Ô캯Êý¡£Í¬ÑùC++µÄ±àÒëÆ÷Ò²»áΪÎö¹¹º¯Êý×Ô¶¯Ìí¼Ó»ùÀàÎö¹¹º¯ÊýµÄµ÷Óᣵ«ÊÇ£¬.NetÖеÄFinalizeº¯Êý²»ÊÇÕâÑù×Ó£¬±àÒëÆ÷²»»á¶ÔFinalize·½·¨×öÌØÊâ´¦Àí¡£Èç¹ûÄãÏëÔÚFinalize·½·¨Öе÷Óø¸ÀàµÄFinalize·½·¨£¬±ØÐë×Ô¼ºÏÔʾÌí¼Óµ÷ÓôúÂë¡£
Çë×¢ÒâÔÚC#ÖÐFinalize·½·¨µÄд·¨ºÍc++ÖеÄÎö¹¹º¯ÊýÒ»Ñù£¬µ«ÊÇC#²»Ö§³ÖÎö¹¹º¯Êý£¬²»ÒªÈÃÕâÖÖд·¨ÆÛÆÄã¡£
GCµ÷ÓÃFinalize·½·¨µÄÄÚ²¿ÊµÏÖ
±íÃæ¿´£¬À¬»ø»ØÊÕÆ÷àÇÓÃFinalize·½·¨ºÜ¼òµ¥£¬Äã´´½¨Ò»¸ö¶ÔÏ󣬵±¶ÔÏó»ØÊÕʱµ÷ÓÃËüµÄFinalize·½·¨¡£µ«ÊÇÊÂʵÉÏÒª¸´ÔÓһЩ¡£
µ±Ó¦ÓóÌÐò´´½¨Ò»¸öжÔÏóʱ£¬new²Ù×÷·ûÔÚ¶ÑÉÏ·ÖÅäÄÚ´æ¡£Èç¹û¶ÔÏóʵÏÖÁËFinalize·½·¨¡£¶ÔÏóµÄÖ¸Õë»á·Åµ½ÖÕ½á¶ÓÁÐÖС£ÖÕ½á¶ÓÁÐÊÇÓÉÀ¬»ø»ØÊÕÆ÷¿ØÖƵÄÄÚ²¿Êý¾Ý½á¹¹¡£ÔÚ¶ÓÁÐÖÐÿһ¸ö¶ÔÏóÔÚ»ØÊÕʱ¶¼ÐèÒªµ÷ÓÃËüÃǵÄFinalize·½·¨¡£
ÏÂͼÏÔʾµÄ¶ÑÉϰüº¬¼¸¸ö¶ÔÏ󣬯äÖÐһЩ¶ÔÏóÊǸú¶ÔÏó£¬Ò»Ð©¶ÔÏó²»ÊÇ¡£µ±¶ÔÏóC¡¢E¡¢F¡¢IºÍJ´´½¨Ê±£¬ÏµÍ³»á¼ì²âÕâЩ¶ÔÏóʵÏÖÁËFinalize·½·¨£¬²¢½«ËüÃǵÄÖ¸Õë·Åµ½ÖÕ½á¶ÓÁÐÖС£
Finalize·½·¨Òª×öµÄÊÂÇéͨ³£ÊÇ»ØÊÕÀ¬»ø»ØÊÕÆ÷²»ÄÜ»ØÊÕµÄ×ÊÔ´£¬ÀýÈçÎļþ¾ä±ú£¬Êý¾Ý¿âÁ¬½ÓµÈµÈ¡£
µ±À¬»ø»ØÊÕʱ£¬¶ÔÏóB¡¢E¡¢G¡¢H¡¢IºÍJ±»±ê¼ÇΪÀ¬»ø¡£À¬»ø»ØÊÕÆ÷ɨÃèÖÕ½á¶ÓÁÐÕÒµ½ÕâЩ¶ÔÏóµÄÖ¸Õë¡£µ±·¢ÏÖ¶ÔÏóÖ¸Õëʱ£¬Ö¸Õë»á±»Òƶ¯µ½Freachable¶ÓÁС£Freachable¶ÓÁÐÊÇÁíÒ»¸öÓÉÀ¬»ø»ØÊÕÆ÷¿ØÖƵÄÄÚ²¿Êý¾Ý½á¹¹¡£ÔÚFreachable¶ÓÁÐÖеÄÿһ¸ö¶ÔÏóµÄFinalize·½·¨½«Ö´ÐС£
À¬»ø»ØÊÕÖ®ºó£¬ÍйܶÑÈçͼ6Ëùʾ¡£Äã¿ÉÒÔ¿´µ½¶ÔÏóB¡¢G¡¢HÒѾ±»»ØÊÕÁË£¬ÒòΪÕ⼸¸ö¶ÔÏóûÓÐFinalize·½·¨¡£È»¶ø¶ÔÏóE¡¢I¡¢J»¹Ã»Óб»»ØÊÕµô£¬ÒòΪËûÃǵÄFinalize·½·¨»¹Ã»ÓÐÖ´ÐС£
ͼ5 À¬»ø»ØÊÕºóµÄÍйܶÑ
³ÌÐòÔËÐÐʱ»áÓÐÒ»¸öרÃŵÄÏ̸߳ºÔðµ÷ÓÃFreachable¶ÓÁÐÖжÔÏóµÄFinalize·½·¨¡£µ±Freachable¶ÓÁÐΪ¿Õʱ£¬Õâ¸öÏ̻߳áÐÝÃߣ¬µ±¶ÓÁÐÖÐÓжÔÏóʱ£¬Ï̱߳»»½ÐÑ£¬ÒƳý¶ÓÁÐÖеĶÔÏ󣬲¢µ÷ÓÃËüÃǵÄFinalize·½·¨¡£Òò´ËÔÚÖ´ÐÐFinalize·½·¨Ê±²»ÒªÆóͼ·ÃÎÊÏ̵߳Älocal storage¡£
ÖÕ½á¶ÓÁУ¨finalization queue£©ºÍFreachable¶ÓÁÐÖ®¼äµÄ½»»¥ºÜÇÉÃî¡£Ê×ÏÈÈÃÎÒ¸æËßÄãfreachableµÄÃû×ÖÊÇÔõôÀ´µÄ¡£FÏÔÈ»ÊÇfinalization£»Ôڴ˶ÓÁÐÖеÄÿһ¸ö¶ÔÏó¶¼ÔڵȴýÖ´ÐÐËûÃǵÄFinalize·½·¨£»reachableÒâ˼ÊÇÕâЩ¶ÔÏóÀ´ÁË¡£ÁíÒ»ÖÖ˵·¨£¬Freachable¶ÓÁÐÖеĶÔÏó±»ÈÏΪÊǸú¶ÔÏ󣬾ÍÏñÊÇÈ«¾Ö±äÁ¿»ò¾²Ì¬±äÁ¿¡£Òò´Ë£¬Èç¹ûÒ»¸ö¶ÔÏóÔÚfreachable¶ÓÁÐÖУ¬ÄÇôÕâ¸ö¶ÔÏó¾Í²»ÊÇÀ¬»ø¡£
¼ò¶Ìµã˵£¬µ±Ò»¸ö¶ÔÏóÊDz»¿É´ïµÄ£¬À¬»ø»ØÊÕÆ÷»áÈÏΪÕâ¸ö¶ÔÏóÊÇÀ¬»ø¡£ÄÇô£¬µ±À¬»ø»ØÊÕÆ÷½«¶ÔÏó´ÓÖÕ½á¶ÓÁÐÒÆ¶¯µ½Freachable¶ÓÁÐÖУ¬ÕâЩ¶ÔÏó¾Í²»ÔÙÊÇÀ¬»øÁË£¬ËüÃǵÄÄÚ´æÒ²²»»á»ØÊÕ¡£´ÓÕâÒ»µãÉÏÀ´½²£¬À¬»ø»ØÊÕÆ÷ÒѾÍê³É±êʶÀ¬»ø£¬Ò»Ð©¶ÔÏó±»±êʶ³ÉÀ¬»øÓÖ±»ÖØÐÂÈÏΪ³É·ÇÀ¬»ø¶ÔÏó¡£À¬»ø»ØÊÕÆ÷»ØÊÕѹËõÄڴ棬Çå¿Õfreachable¶ÓÁУ¬Ö´ÐжÓÁÐÖÐÿһ¸ö¶ÔÏóµÄFinalize·½·¨¡£
ͼ6 ÔÙ´ÎÖ´ÐÐÀ¬»ø»ØÊÕºóµÄÍйܶÑ
Ôٴγö·¢À¬»ø»ØÊÕÖ®ºó£¬ÊµÏÖFinalize·½·¨µÄ¶ÔÏó²Å±»ÕæÕýµÄ»ØÊÕ¡£ÕâЩ¶ÔÏóµÄFinalize·½·¨ÒѾִÐйýÁË£¬Freachable¶ÓÁÐÇå¿ÕÁË¡£
À¬»ø»ØÊÕÈöÔÏó¸´»î
ÔÚÇ°Ãæ²¿·ÖÎÒÃÇÒѾ˵ÁË£¬µ±³ÌÐò²»Ê¹ÓÃij¸ö¶ÔÏóʱ£¬Õâ¸ö¶ÔÏó»á±»»ØÊÕ¡£È»¶ø£¬Èç¹û¶ÔÏóʵÏÖÁËFinalize·½·¨£¬Ö»Óе±¶ÔÏóµÄFinalize·½·¨Ö´ÐÐÖ®ºó²Å»áÈÏΪÕâ¸ö¶ÔÏóÊǿɻØÊÕ¶ÔÏó²¢ÕæÕý»ØÊÕÆäÄÚ´æ¡£»»¾ä»°Ëµ£¬ÕâÀà¶ÔÏó»áÏȱ»±êʶΪÀ¬»ø£¬È»ºó·Åµ½freachable¶ÓÁÐÖи´»î£¬È»ºóÖ´ÐÐFinalizeÖ®ºó²Å±»»ØÊÕ¡£ÕýÊÇFinalize·½·¨µÄµ÷Óã¬ÈÃÕâÖÖ¶ÔÏóÓлú»á¸´»î£¬ÎÒÃÇ¿ÉÒÔÔÚFinalize·½·¨ÖÐÈÃij¸ö¶ÔÏóÇ¿ÒýÓÃÕâ¸ö¶ÔÏó£»ÄÇôÀ¬»ø»ØÊÕÆ÷¾ÍÈÏΪÕâ¸ö¶ÔÏó²»ÔÙÊÇÀ¬»øÁË£¬¶ÔÏó¾Í¸´»îÁË¡£
Èçϸ´»îÑÝʾ´úÂ룺
public class Foo { ~Foo(){ Application.ObjHolder = this; } } class Application{ static public Object ObjHolder = null; }
ÔÚÕâÖÖÇé¿öÏ£¬µ±¶ÔÏóµÄFinalize·½·¨Ö´ÐÐÖ®ºó£¬¶ÔÏó±»ApplicationµÄ¾²Ì¬×Ö¶ÎObjHolderÇ¿ÒýÓ㬳ÉΪ¸ù¶ÔÏó¡£Õâ¸ö¶ÔÏó¾Í¸´»îÁË£¬¶øÕâ¸ö¶ÔÏóÒýÓõĶÔÏóÒ²¾Í¸´»îÁË£¬µ«ÊÇÕâЩ¶ÔÏóµÄFinalize·½·¨¿ÉÄÜÒѾִÐйýÁË£¬¿ÉÄÜ»áÓÐÒâÏë²»µ½µÄ´íÎó·¢Éú¡£
ÊÂʵÉÏ£¬µ±ÄãÉè¼Æ×Ô¼ºµÄÀàÐÍʱ£¬¶ÔÏóµÄÖÕ½áºÍ¸´»îÓпÉÄÜÍêÈ«²»¿É¿ØÖÆ¡£Õâ²»ÊÇÒ»¸öºÃÏÖÏó£»´¦ÀíÕâÖÖÇé¿öµÄ³£ÓÃ×ö·¨ÊÇÔÚÀàÖж¨ÒåÒ»¸öbool±äÁ¿À´±íʾ¶ÔÏóÊÇ·ñÖ´ÐйýÁËFinalize·½·¨£¬Èç¹ûÖ´ÐйýFinalize·½·¨£¬ÔÙÖ´ÐÐÆäËû·½·¨Ê±¾ÍÅ׳öÒì³£¡£
ÏÖÔÚ£¬Èç¹ûÓÐÆäËûµÄ´úÂëÆ¬¶ÎÓÖ½«Application.ObjHolderÉèÖÃΪnull£¬Õâ¸ö¶ÔÏó±ä³É²»¿É´ï¶ÔÏó¡£×îÖÕÀ¬»ø»ØÊÕÆ÷»á°Ñ¶ÔÏóµ±³ÉÀ¬»ø²¢»ØÊÕ¶ÔÏóÄÚ´æ¡£Çë×¢ÒâÕâÒ»´Î¶ÔÏó²»»á³öÏÖÔÚfinalization¶ÓÁÐÖУ¬ËüµÄFinalize·½·¨Ò²²»»áÔÙÖ´ÐÐÁË¡£
¸´»îÖ»ÓÐÓÐÏ޵ļ¸ÖÖÓô¦£¬ÄãÓ¦¸Ã¾¡¿ÉÄܱÜÃâʹÓø´»î¡£¾¡¹ÜÈç´Ë£¬µ±Ê¹Óø´»îʱ£¬×îºÃÖØÐ½«¶ÔÏóÌí¼Óµ½ÖÕ½á¶ÓÁÐÖУ¬GCÌṩÁ˾²Ì¬·½·¨ReRegisterForFinalize·½·¨×öÕâ¼þÊ£º
ÈçÏ´úÂë:
public class Foo{ ~Foo(){ Application.ObjHolder = this; GC.ReRegisterForFinalize(this); } }¶ÔÏó¸´»îʱ£¬ÖØÐ½«¶ÔÏóÌí¼Óµ½¸´»î¶ÓÁÐÖС£ÐèҪעÒâµÄʱÈç¹ûÒ»¸ö¶ÔÏóÒѾÔÚÖÕ½á¶ÓÁÐÖУ¬È»ºóÓÖµ÷ÓÃÁËGC.ReRegisterForFinalize(obj)·½·¨»áµ¼Ö´˶ÔÏóµÄFinalize·½·¨Öظ´Ö´ÐС£
À¬»ø»ØÊÕ»úÖÆµÄÄ¿µÄÊÇΪ¿ª·¢ÈËÔ±¼ò»¯ÄÚ´æ¹ÜÀí¡£
ÍÆ¼öÐÅÏ¢
ÈÈÃÅÐÅÏ¢
- nohup: redirecting stderr to stdou....
- ʹÓÃlog_formatΪNginx·þÎñÆ÷ÉèÖøüÏêϸµÄÈÕÖ¾¸ñʽ
- jquery easyUI--dataGrid-Json
- [Ô´´]·ÂGoogle Reader¡¢ÐÂÀË΢²©¡¢ÌÚѶ΢²©µ....
- ÀûÓÃKeepalived+mysql¹¹½¨¸ß¿ÉÓÃMySQLË«Ö÷×Ô¶....
- Nginx+keepalivedʵÏÖ¸ºÔؾùºâºÍË«»úÈȱ¸¸ß¿ÉÓÃ
- jqueryʵÏÖÒ³Ãæ¼ÓÔØ½ø¶ÈÌõ
- Rolling cURL: PHP²¢·¢×î¼Ñʵ¼ù
- codeigniter ·ÓÉÖÕ¼«ÓÅ»¯(url rewrite)
- linuxÏÂÉèÖÃsshÎÞÃÜÂëµÇ¼
×î½ü¸üÐÂ
- Asp.net MVCÔ´Âë·ÖÎö--Model Validation(Se....
- .Net À¬»ø»ØÊÕ»úÖÆÔÀíºÍËã·¨£¨Ò»£©
- .netʵÌåнâ
- ·ÖÎöASP.NET¶ÁÈ¡XMLÎļþ4ÖÖ·½·¨
- »ñÈ¡ÍøÕ¾ËõÂÔͼ´úÂë
- Asp.net ¸ù¾ÝIPµØÖ·»ñÈ¡¿çÍø¶ÎmacµØÖ·º¯Êý¡¾ËѲء¿
- ¹ýÂËÃô¸Ð¹Ø¼ü×Ö¡£
- Éú³ÉÖ¸¶¨Î»ÊýµÄËæ»ú×Ö·û´®
- ¿Í»§¶Ë»ñÈ¡MACµØÖ·£¬µ½·þÎñÆ÷ÑéÖ¤
- ²½²½ÎªÓª .NETÈý²ã¼Ü¹¹½âÎö ¶þ¡¢Êý¾Ý¿âÉè¼Æ
ÆÀÂÛ