GCµÄǰÊÀÓë½ñÉú
ËäÈ»±¾ÎÄÊÇÒÔ.NET×÷ΪĿ±êÀ´½²ÊöGC£¬µ«ÊÇGCµÄ¸ÅÄî²¢·Ç²Åµ®Éú²»¾Ã¡£ÔçÔÚ1958Ä꣬Óɶ¦¶¦´óÃûµÄͼÁÖ½±µÃÖ÷John
McCarthyËùʵÏÖµÄLispÓïÑÔ¾ÍÒѾÌṩÁËGCµÄ¹¦ÄÜ£¬ÕâÊÇGCµÄµÚÒ»´Î³öÏÖ¡£LispµÄ³ÌÐòÔ±ÈÏΪÄÚ´æ¹ÜÀíÌ«ÖØÒªÁË£¬ËùÒÔ²»ÄÜÓɳÌÐòÔ±×Ô¼ºÀ´¹ÜÀí¡£
µ«ºóÀ´µÄÈÕ×ÓÀïLispȴûÓÐ³ÉÆøºò£¬²ÉÓÃÄÚ´æÊÖ¶¯¹ÜÀíµÄÓïÑÔÕ¼¾ÝÁËÉϷ磬ÒÔCΪ´ú±í¡£³öÓÚͬÑùµÄÀíÓÉ£¬²»Í¬µÄÈËÈ´ÓÖ²»Í¬µÄ¿´·¨£¬C³ÌÐòÔ±ÈÏΪÄÚ´æ¹ÜÀíÌ«ÖØÒªÁË£¬ËùÒÔ²»ÄÜÓÉϵͳÀ´¹ÜÀí£¬²¢ÇÒ¼¥Ð¦Lisp³ÌÐòÂýÈçÎÚ¹êµÄÔËÐÐËÙ¶È¡£µÄÈ·£¬ÔÚÄǸö¶Ôÿһ¸öByte¶¼Òª¾«ÐļÆËãµÄÄê´úGCµÄËٶȺͶÔϵͳ×ÊÔ´µÄ´óÁ¿Õ¼ÓÃʹºÜ¶àÈ˵ÄÎÞ·¨½ÓÊÜ¡£¶øºó£¬1984ÄêÓÉDave
Ungar¿ª·¢µÄSmalltalkÓïÑÔµÚÒ»´Î²ÉÓÃÁËGenerational garbage collectionµÄ¼¼Êõ£¨Õâ¸ö¼¼ÊõÔÚÏÂÎÄÖлá̸µ½£©£¬µ«ÊÇSmalltalkҲûÓеõ½Ê®·Ö¹ã·ºµÄÓ¦Óá£
Ö±µ½20ÊÀ¼Í90Äê´úÖÐÆÚGC²ÅÒÔÖ÷½ÇµÄÉí·ÝµÇÉÏÁËÀúÊ·µÄÎę̀£¬Õâ²»µÃ²»¹é¹¦ÓÚJavaµÄ½ø²½£¬½ñÈÕµÄGCÒÑ·ÇÎâϰ¢ÃÉ¡£Java²ÉÓÃVM£¨Virtual
Machine£©»úÖÆ£¬ÓÉVMÀ´¹ÜÀí³ÌÐòµÄÔËÐе±È»Ò²°üÀ¨¶ÔGC¹ÜÀí¡£90Äê´úÄ©ÆÚ.NET³öÏÖÁË£¬.NET²ÉÓÃÁ˺ÍJavaÀàËÆµÄ·½·¨ÓÉCLR(Common
Language Runtime)À´¹ÜÀí¡£ÕâÁ½´óÕóÓªµÄ³öÏÖ½«ÈËÃÇÒýÈëÁËÒÔÐéÄâÆ½Ì¨Îª»ù´¡µÄ¿ª·¢Ê±´ú£¬GCÒ²ÔÚÕâ¸öʱºòÔ½À´Ô½µÃµ½´óÖڵĹØ×¢¡£
ΪʲôҪʹÓÃGCÄØ£¿Ò²¿ÉÒÔ˵ÊÇΪʲôҪʹÓÃÄÚ´æ×Ô¶¯¹ÜÀí£¿ÓÐÏÂÃæµÄ¼¸¸öÔÒò£º
¡¡¡¡1¡¢Ìá¸ßÁËÈí¼þ¿ª·¢µÄ³éÏó¶È£»
¡¡¡¡2¡¢³ÌÐòÔ±¿ÉÒÔ½«¾«Á¦¼¯ÖÐÔÚʵ¼ÊµÄÎÊÌâÉ϶ø²»Ó÷ÖÐÄÀ´¹ÜÀíÄÚ´æµÄÎÊÌ⣻
¡¡¡¡3¡¢¿ÉÒÔʹģ¿éµÄ½Ó¿Ú¸ü¼ÓµÄÇåÎú£¬¼õСģ¿é¼äµÄżºÏ£»
¡¡¡¡4¡¢´ó´ó¼õÉÙÁËÄÚ´æÈËΪ¹ÜÀí²»µ±Ëù´øÀ´µÄBug£»
¡¡¡¡5¡¢Ê¹ÄÚ´æ¹ÜÀí¸ü¼Ó¸ßЧ¡£
×ܵÄ˵À´¾ÍÊÇGC¿ÉÒÔʹ³ÌÐòÔ±¿ÉÒÔ´Ó¸´ÔÓµÄÄÚ´æÎÊÌâÖаÚÍѳöÀ´£¬´Ó¶øÌá¸ßÁËÈí¼þ¿ª·¢µÄËÙ¶È¡¢ÖÊÁ¿ºÍ°²È«ÐÔ¡£
ʲôÊÇGC
GCÈçÆäÃû£¬¾ÍÊÇÀ¬»øÊÕ¼¯£¬µ±È»ÕâÀï½ö¾ÍÄÚ´æ¶øÑÔ¡£Garbage Collector£¨À¬»øÊÕ¼¯Æ÷£¬ÔÚ²»ÖÁÓÚ»ìÏýµÄÇé¿öÏÂÒ²³ÉΪGC£©ÒÔÓ¦ÓóÌÐòµÄrootΪ»ù´¡£¬±éÀúÓ¦ÓóÌÐòÔÚHeapÉ϶¯Ì¬·ÖÅäµÄËùÓжÔÏó[2]£¬Í¨¹ýʶ±ðËüÃÇÊÇ·ñ±»ÒýÓÃÀ´È·¶¨ÄÄЩ¶ÔÏóÊÇÒѾËÀÍöµÄ¡¢ÄÄЩÈÔÐèÒª±»Ê¹Óá£ÒѾ²»ÔÙ±»Ó¦ÓóÌÐòµÄroot»òÕß±ðµÄ¶ÔÏóËùÒýÓõĶÔÏó¾ÍÊÇÒѾËÀÍöµÄ¶ÔÏ󣬼´ËùνµÄÀ¬»ø£¬ÐèÒª±»»ØÊÕ¡£Õâ¾ÍÊÇGC¹¤×÷µÄÔÀí¡£ÎªÁËʵÏÖÕâ¸öÔÀí£¬GCÓжàÖÖËã·¨¡£±È½Ï³£¼ûµÄËã·¨ÓÐReference
Counting£¬Mark Sweep£¬Copy CollectionµÈµÈ¡£Ä¿Ç°Ö÷Á÷µÄÐéÄâϵͳ.NET
CLR£¬Java VMºÍRotor¶¼ÊDzÉÓõÄMark SweepËã·¨¡£
Ò»¡¢Mark-Compact ±ê¼ÇѹËõËã·¨
¼òµ¥µØ°Ñ.NETµÄGCËã·¨¿´×÷Mark-CompactËã·¨¡£½×¶Î1: Mark-Sweep ±ê¼ÇÇå³ý½×¶Î£¬ÏȼÙÉèheapÖÐËùÓжÔÏ󶼿ÉÒÔ»ØÊÕ£¬È»ºóÕÒ³ö²»ÄÜ»ØÊյĶÔÏ󣬸øÕâЩ¶ÔÏó´òÉϱê¼Ç£¬×îºóheapÖÐûÓдò±ê¼ÇµÄ¶ÔÏó¶¼ÊÇ¿ÉÒÔ±»»ØÊյ컽׶Î2:
Compact ѹËõ½×¶Î£¬¶ÔÏó»ØÊÕÖ®ºóheapÄÚ´æ¿Õ¼ä±äµÃ²»Á¬Ðø£¬ÔÚheapÖÐÒÆ¶¯ÕâЩ¶ÔÏó£¬Ê¹ËûÃÇÖØÐ´Óheap»ùµØÖ·¿ªÊ¼Á¬ÐøÅÅÁУ¬ÀàËÆÓÚ´ÅÅ̿ռäµÄË鯬ÕûÀí¡£

HeapÄÚ´æ¾¹ý»ØÊÕ¡¢Ñ¹ËõÖ®ºó£¬¿ÉÒÔ¼ÌÐø²ÉÓÃÇ°ÃæµÄheapÄÚ´æ·ÖÅä·½·¨£¬¼´½öÓÃÒ»¸öÖ¸Õë¼Ç¼heap·ÖÅäµÄÆðʼµØÖ·¾Í¿ÉÒÔ¡£Ö÷Òª´¦Àí²½Ö裺½«Ïß³Ì¹ÒÆð¡úÈ·¶¨roots¡ú´´½¨reachable
objects graph¡ú¶ÔÏó»ØÊÕ¡úheapѹËõ¡úÖ¸ÕëÐÞ¸´¡£¿ÉÒÔÕâÑùÀí½âroots£ºheapÖжÔÏóµÄÒýÓùØÏµ´í×Û¸´ÔÓ£¨½»²æÒýÓá¢Ñ»·ÒýÓã©£¬Ðγɸ´ÔÓµÄgraph£¬rootsÊÇCLRÔÚheapÖ®Íâ¿ÉÒÔÕÒµ½µÄ¸÷ÖÖÈë¿Úµã¡£
GCËÑË÷rootsµÄµØ·½°üÀ¨È«¾Ö¶ÔÏó¡¢¾²Ì¬±äÁ¿¡¢¾Ö²¿¶ÔÏ󡢺¯Êýµ÷ÓòÎÊý¡¢µ±Ç°CPU¼Ä´æÆ÷ÖеĶÔÏóÖ¸Õ루»¹ÓÐfinalization
queue£©µÈ¡£Ö÷Òª¿ÉÒÔ¹éΪ2ÖÖÀàÐÍ£ºÒѾ³õʼ»¯Á˵ľ²Ì¬±äÁ¿¡¢Ïß³ÌÈÔÔÚʹÓõĶÔÏó£¨stack+CPU
register£© ¡£ Reachable objects£ºÖ¸¸ù¾Ý¶ÔÏóÒýÓùØÏµ£¬´Óroots³ö·¢¿ÉÒÔµ½´ïµÄ¶ÔÏó¡£ÀýÈ統ǰִÐк¯ÊýµÄ¾Ö²¿±äÁ¿¶ÔÏóAÊÇÒ»¸öroot
object£¬ËûµÄ³ÉÔ±±äÁ¿ÒýÓÃÁ˶ÔÏóB£¬ÔòBÊÇÒ»¸öreachable object¡£´Óroots³ö·¢¿ÉÒÔ´´½¨reachable
objects graph£¬Ê£Óà¶ÔÏó¼´Îªunreachable£¬¿ÉÒÔ±»»ØÊÕ ¡£

Ö¸ÕëÐÞ¸´ÊÇÒòΪcompact¹ý³ÌÒÆ¶¯ÁËheap¶ÔÏ󣬶ÔÏóµØÖ··¢Éú±ä»¯£¬ÐèÒªÐÞ¸´ËùÓÐÒýÓÃÖ¸Õ룬°üÀ¨stack¡¢CPU
registerÖеÄÖ¸ÕëÒÔ¼°heapÖÐÆäËû¶ÔÏóµÄÒýÓÃÖ¸Õë¡£DebugºÍreleaseÖ´ÐÐģʽ֮¼äÉÔÓÐÇø±ð£¬releaseģʽϺóÐø´úÂëûÓÐÒýÓõĶÔÏóÊÇunreachableµÄ£¬¶ødebugģʽÏÂÐèÒªµÈµ½µ±Ç°º¯ÊýÖ´ÐÐÍê±Ï£¬ÕâЩ¶ÔÏó²Å»á³ÉΪunreachable£¬Ä¿µÄÊÇΪÁ˵÷ÊÔʱ¸ú×Ù¾Ö²¿¶ÔÏóµÄÄÚÈÝ¡£´«¸øÁËCOM+µÄÍйܶÔÏóÒ²»á³ÉΪroot£¬²¢ÇÒ¾ßÓÐÒ»¸öÒýÓüÆÊýÆ÷ÒÔ¼æÈÝCOM+µÄÄÚ´æ¹ÜÀí»úÖÆ£¬ÒýÓüÆÊýÆ÷Ϊ0ʱ£¬ÕâЩ¶ÔÏó²Å¿ÉÄܳÉΪ±»»ØÊÕ¶ÔÏó¡£Pinned
objectsÖ¸·ÖÅäÖ®ºó²»ÄÜÒÆ¶¯Î»ÖõĶÔÏó£¬ÀýÈç´«µÝ¸ø·ÇÍйܴúÂëµÄ¶ÔÏ󣨻òÕßʹÓÃÁËfixed¹Ø¼ü×Ö£©£¬GCÔÚÖ¸ÕëÐÞ¸´Ê±ÎÞ·¨Ð޸ķÇÍйܴúÂëÖеÄÒýÓÃÖ¸Õ룬Òò´Ë½«ÕâЩ¶ÔÏóÒÆ¶¯½«·¢ÉúÒì³£¡£pinned
objects»áµ¼ÖÂheap³öÏÖË鯬£¬µ«´ó²¿·ÖÇé¿öÀ´Ëµ´«¸ø·ÇÍйܴúÂëµÄ¶ÔÏóÓ¦µ±ÔÚGCʱÄܹ»±»»ØÊÕµô¡£
¡¡¡¡¡¡¡¡¡¡¡¡
¶þ¡¢ Generational ·Ö´úËã·¨
³ÌÐò¿ÉÄÜʹÓü¸°ÙM¡¢¼¸GµÄÄڴ棬¶ÔÕâÑùµÄÄÚ´æÇøÓò½øÐÐGC²Ù×÷³É±¾ºÜ¸ß£¬·Ö´úËã·¨¾ß±¸Ò»¶¨Í³¼ÆÑ§»ù´¡£¬¶ÔGCµÄÐÔÄܸÄÉÆÐ§¹û±È½ÏÃ÷ÏÔ¡£½«¶ÔÏó°´ÕÕÉúÃüÖÜÆÚ·Ö³Éеġ¢Àϵ쬏ù¾Ýͳ¼Æ·Ö²¼¹æÂÉËù·´Ó³µÄ½á¹û£¬¿ÉÒÔ¶ÔС¢ÀÏÇøÓò²ÉÓò»Í¬µÄ»ØÊÕ²ßÂÔºÍËã·¨£¬¼ÓÇ¿¶ÔÐÂÇøÓòµÄ»ØÊÕ´¦ÀíÁ¦¶È£¬ÕùÈ¡Ôڽ϶Ìʱ¼ä¼ä¸ô¡¢½ÏСµÄÄÚ´æÇøÓòÄÚ£¬ÒԽϵͳɱ¾½«Ö´Ðз¾¶ÉÏ´óÁ¿Ð½üÅׯú²»ÔÙʹÓõľֲ¿¶ÔÏó¼°Ê±»ØÊÕµô¡£·Ö´úËã·¨µÄ¼ÙÉèǰÌáÌõ¼þ£º
1¡¢´óÁ¿Ð´´½¨µÄ¶ÔÏóÉúÃüÖÜÆÚ¶¼±È½Ï¶Ì£¬¶ø½ÏÀϵĶÔÏóÉúÃüÖÜÆÚ»á¸ü³¤£»
2¡¢¶Ô²¿·ÖÄÚ´æ½øÐлØÊձȻùÓÚÈ«²¿ÄÚ´æµÄ»ØÊÕ²Ù×÷Òª¿ì£»
3¡¢Ð´´½¨µÄ¶ÔÏóÖ®¼ä¹ØÁª³Ì¶Èͨ³£½ÏÇ¿¡£heap·ÖÅäµÄ¶ÔÏóÊÇÁ¬ÐøµÄ£¬¹ØÁª¶È½ÏÇ¿ÓÐÀûÓÚÌá¸ßCPU cacheµÄÃüÖÐÂÊ£¬.NET½«heap·Ö³É3¸ö´úÁäÇøÓò:
Gen 0¡¢Gen 1¡¢Gen 2£»

Heap·ÖΪ3¸ö´úÁäÇøÓò£¬ÏàÓ¦µÄGCÓÐ3ÖÖ·½Ê½: # Gen 0 collections, #
Gen 1 collections, #Gen 2 collections¡£Èç¹ûGen 0 heapÄÚ´æ´ïµ½·§Öµ£¬Ôò´¥·¢0´úGC£¬0´úGCºóGen
0ÖÐÐÒ´æµÄ¶ÔÏó½øÈëGen1¡£Èç¹ûGen 1µÄÄÚ´æ´ïµ½·§Öµ£¬Ôò½øÐÐ1´úGC£¬1´úGC½«Gen 0 heapºÍGen
1 heapÒ»Æð½øÐлØÊÕ£¬ÐÒ´æµÄ¶ÔÏó½øÈëGen2¡£
2´úGC½«Gen 0 heap¡¢Gen 1 heapºÍGen 2 heapÒ»Æð»ØÊÕ£¬Gen 0ºÍGen
1±È½ÏС£¬ÕâÁ½¸ö´úÁä¼ÓÆðÀ´×ÜÊDZ£³ÖÔÚ16M×óÓÒ£»Gen2µÄ´óСÓÉÓ¦ÓóÌÐòÈ·¶¨£¬¿ÉÄÜ´ïµ½¼¸G£¬Òò´Ë0´úºÍ1´úGCµÄ³É±¾·Ç³£µÍ£¬2´úGC³ÆÎªfull
GC£¬Í¨³£³É±¾ºÜ¸ß¡£´ÖÂԵļÆËã0´úºÍ1´úGCÓ¦µ±ÄÜÔÚ¼¸ºÁÃëµ½¼¸Ê®ºÁÃëÖ®¼äÍê³É£¬Gen 2 heap±È½Ï´óʱ£¬full
GC¿ÉÄÜÐèÒª»¨·Ñ¼¸Ãëʱ¼ä¡£´óÖÂÉÏÀ´½².NETÓ¦ÓÃÔËÐÐÆÚ¼ä£¬2´ú¡¢1´úºÍ0´úGCµÄƵÂÊÓ¦µ±´óÖÂΪ1:10:100¡£
Èý¡¢Finalization QueueºÍFreachable
Queue
ÕâÁ½¸ö¶ÓÁкÍ.NET¶ÔÏóËùÌṩµÄFinalize·½·¨Óйء£ÕâÁ½¸ö¶ÓÁв¢²»ÓÃÓÚ´æ´¢ÕæÕýµÄ¶ÔÏ󣬶øÊÇ´æ´¢Ò»×éÖ¸Ïò¶ÔÏóµÄÖ¸Õë¡£µ±³ÌÐòÖÐʹÓÃÁËnew²Ù×÷·ûÔÚManaged
HeapÉÏ·ÖÅä¿Õ¼äʱ£¬GC»á¶ÔÆä½øÐзÖÎö£¬Èç¹û¸Ã¶ÔÏóº¬ÓÐFinalize·½·¨ÔòÔÚFinalization
QueueÖÐÌí¼ÓÒ»¸öÖ¸Ïò¸Ã¶ÔÏóµÄÖ¸Õë¡£
ÔÚGC±»Æô¶¯ÒԺ󣬾¹ýMark½×¶Î·Ö±æ³öÄÄЩÊÇÀ¬»ø¡£ÔÙÔÚÀ¬»øÖÐËÑË÷£¬Èç¹û·¢ÏÖÀ¬»øÖÐÓб»Finalization
QueueÖеÄÖ¸ÕëËùÖ¸ÏòµÄ¶ÔÏó£¬Ôò½«Õâ¸ö¶ÔÏó´ÓÀ¬»øÖзÖÀë³öÀ´£¬²¢½«Ö¸ÏòËüµÄÖ¸ÕëÒÆ¶¯µ½Freachable
QueueÖС£Õâ¸ö¹ý³Ì±»³ÆÎªÊǶÔÏóµÄ¸´Éú£¨Resurrection£©£¬±¾À´ËÀÈ¥µÄ¶ÔÏó¾ÍÕâÑù±»¾È»îÁË¡£ÎªÊ²Ã´Òª¾È»îËüÄØ£¿ÒòΪÕâ¸ö¶ÔÏóµÄFinalize·½·¨»¹Ã»Óб»Ö´ÐУ¬ËùÒÔ²»ÄÜÈÃËüËÀÈ¥¡£Freachable
Queueƽʱ²»×öʲôÊ£¬µ«ÊÇÒ»µ©ÀïÃæ±»Ìí¼ÓÁËÖ¸ÕëÖ®ºó£¬Ëü¾Í»áÈ¥´¥·¢ËùÖ¸¶ÔÏóµÄFinalize·½·¨Ö´ÐУ¬Ö®ºó½«Õâ¸öÖ¸Õë´Ó¶ÓÁÐÖÐÌÞ³ý£¬ÕâÊǶÔÏó¾Í¿ÉÒÔ°²¾²µÄËÀÈ¥ÁË¡£
.NET FrameworkµÄSystem.GCÀàÌṩÁË¿ØÖÆFinalizeµÄÁ½¸ö·½·¨£¬ReRegisterForFinalizeºÍSuppressFinalize¡£Ç°ÕßÊÇÇëÇóϵͳÍê³É¶ÔÏóµÄFinalize·½·¨£¬ºóÕßÊÇÇëÇóϵͳ²»ÒªÍê³É¶ÔÏóµÄFinalize·½·¨¡£ReRegisterForFinalize·½·¨Æäʵ¾ÍÊǽ«Ö¸Ïò¶ÔÏóµÄÖ¸ÕëÖØÐÂÌí¼Óµ½Finalization
QueueÖС£Õâ¾Í³öÏÖÁËÒ»¸öºÜÓÐȤµÄÏÖÏó£¬ÒòΪÔÚFinalization QueueÖеĶÔÏó¿ÉÒÔ¸´Éú£¬Èç¹ûÔÚ¶ÔÏóµÄFinalize·½·¨Öе÷ÓÃReRegisterForFinalize·½·¨£¬ÕâÑù¾ÍÐγÉÁËÒ»¸öÔÚ¶ÑÉÏÓÀÔ¶²»»áËÀÈ¥µÄ¶ÔÏó£¬Ïñ·ï»ËÄù˜„Ò»Ñùÿ´ÎËÀµÄʱºò¶¼¿ÉÒÔ¸´Éú¡£
ÍйÜ×ÊÔ´£º
.NETÖеÄËùÓÐÀàÐͶ¼ÊÇ£¨Ö±½Ó»ò¼ä½Ó£©´ÓSystem.ObjectÀàÐÍÅÉÉúµÄ¡£
CTSÖеÄÀàÐͱ»·Ö³ÉÁ½´óÀࡪ¡ªÒýÓÃÀàÐÍ£¨reference type£¬ÓÖ½ÐÍйÜÀàÐÍ[managed
type]£©£¬·ÖÅäÔÚÄÚ´æ¶ÑÉÏ£»ÖµÀàÐÍ£¨value type£©£¬·ÖÅäÔÚ¶ÑÕ»ÉÏ¡£Èçͼ£º

ÖµÀàÐÍÔÚÕ»ÀÏȽøºó³ö£¬ÖµÀàÐͱäÁ¿µÄÉúÃüÓÐÏȺó˳Ðò£¬Õâ¸öÈ·±£ÁËÖµÀàÐͱäÁ¿ÔÚÍ˳ö×÷ÓÃÓòÒÔǰ»áÊÍ·Å×ÊÔ´¡£±ÈÒýÓÃÀàÐ͸ü¼òµ¥ºÍ¸ßЧ¡£¶ÑÕ»ÊǴӸߵØÖ·ÍùµÍµØÖ··ÖÅäÄÚ´æ¡£
ÒýÓÃÀàÐÍ·ÖÅäÔÚÍйܶÑ(Managed Heap)ÉÏ£¬ÉùÃ÷Ò»¸ö±äÁ¿ÔÚÕ»Éϱ£´æ£¬µ±Ê¹ÓÃnew´´½¨¶ÔÏóʱ£¬»á°Ñ¶ÔÏóµÄµØÖ·´æ´¢ÔÚÕâ¸ö±äÁ¿Àï¡£ÍйܶÑÏà·´£¬´ÓµÍµØÖ·Íù¸ßµØÖ··ÖÅäÄڴ棬Èçͼ£º

.NETÖг¬¹ý80%µÄ×ÊÔ´¶¼ÊÇÍйÜ×ÊÔ´¡£
·ÇÍйÜ×ÊÔ´£º¡¡
ApplicationContext, Brush, Component, ComponentDesigner,
Container, Context, Cursor, FileStream, Font, Icon,
Image, Matrix, Object, OdbcDataReader, OleDBDataReader,
Pen, Regex, Socket, StreamWriter, Timer, Tooltip,
Îļþ¾ä±ú, GDI×ÊÔ´, Êý¾Ý¿âÁ¬½ÓµÈµÈ×ÊÔ´¡£¿ÉÄÜÔÚʹÓõÄʱºòºÜ¶à¶¼Ã»ÓÐ×¢Òâµ½£¡
.NETµÄGC»úÖÆÓÐÕâÑùÁ½¸öÎÊÌ⣺
Ê×ÏÈ£¬GC²¢²»ÊÇÄÜÊÍ·ÅËùÓеÄ×ÊÔ´¡£Ëü²»ÄÜ×Ô¶¯ÊÍ·Å·ÇÍйÜ×ÊÔ´¡£
µÚ¶þ£¬GC²¢²»ÊÇʵʱÐԵģ¬Õ⽫»áÔì³ÉϵͳÐÔÄÜÉÏµÄÆ¿¾±ºÍ²»È·¶¨ÐÔ¡£
GC²¢²»ÊÇʵʱÐԵģ¬Õâ»áÔì³ÉϵͳÐÔÄÜÉÏµÄÆ¿¾±ºÍ²»È·¶¨ÐÔ¡£ËùÒÔÓÐÁËIDisposable½Ó¿Ú£¬IDisposable½Ó¿Ú¶¨ÒåÁËDispose·½·¨£¬Õâ¸ö·½·¨ÓÃÀ´¹©³ÌÐòÔ±ÏÔʽµ÷ÓÃÒÔÊÍ·Å·ÇÍйÜ×ÊÔ´¡£Ê¹ÓÃusingÓï¾ä¿ÉÒÔ¼ò»¯×ÊÔ´¹ÜÀí¡£
///summary
/// Ö´ÐÐSQLÓï¾ä£¬·µ»ØÓ°ÏìµÄ¼Ç¼Êý
////summary
///param name="SQLString"SQLÓï¾ä/param
///returnsÓ°ÏìµÄ¼Ç¼Êý/returns
publicstaticint ExecuteSql(string SQLString)
{
using (SqlConnection connection =new SqlConnection(connectionString))
{
using (SqlCommand cmd =new SqlComm
and(SQLString, connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.
SqlException e)
{
connection.Close();
throw e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
} |
µ±ÄãÓÃDispose·½·¨ÊÍ·ÅδÍйܶÔÏóµÄʱºò£¬Ó¦¸Ãµ÷ÓÃGC.SuppressFinalize¡£Èç¹û¶ÔÏóÕýÔÚÖÕ½á¶ÓÁÐ(finalization
queue), GC.SuppressFinalize»á×èÖ¹GCµ÷ÓÃFinalize·½·¨¡£ÒòΪFinalize·½·¨µÄµ÷ÓûáÎþÉü²¿·ÖÐÔÄÜ¡£Èç¹ûÄãµÄDispose·½·¨ÒѾ¶ÔίÍйÜ×ÊÔ´×÷ÁËÇåÀí£¬¾Íû±ØÒªÈÃGCÔÙµ÷ÓöÔÏóµÄFinalize·½·¨(MSDN)¡£¸½ÉÏMSDNµÄ´úÂ룬´ó¼Ò¿ÉÒԲο¼¡£
publicclass
BaseResource : IDisposable
{
// Ö¸ÏòÍⲿ·ÇÍйÜ×ÊÔ´
private IntPtr handle;
// ´ËÀàʹÓÃµÄÆäËüÍйÜ×ÊÔ´.
private Component Components;
// ¸ú×ÙÊÇ·ñµ÷ÓÃ.Dispose·½·¨£¬±êʶ룬
¿ØÖÆÀ¬»øÊÕ¼¯Æ÷µÄÐÐΪ
privatebool disposed =false;
// ¹¹Ô캯Êý
public BaseResource()
{
// Insert appropriate constructor code here.
}
// ʵÏÖ½Ó¿ÚIDisposable.
// ²»ÄÜÉùÃ÷ΪÐé·½·¨virtual.
// ×ÓÀ಻ÄÜÖØÐ´Õâ¸ö·½·¨.
publicvoid Dispose()
{
Dispose(true);
// À뿪ÖÕ½á¶ÓÁÐFinalization queue
// ÉèÖöÔÏóµÄ×èÖ¹ÖÕ½áÆ÷´úÂë
//
GC.SuppressFinalize(this);
}
// Dispose(bool disposing) Ö´ÐзÖÁ½ÖÖ
²»Í¬µÄÇé¿ö.
// Èç¹ûdisposing µÈÓÚ true, ·½·¨ÒѾ±»µ÷ÓÃ
// »òÕß¼ä½Ó±»Óû§´úÂëµ÷ÓÃ. ÍйܺͷÇÍйܵÄ
´úÂë¶¼Äܱ»ÊÍ·Å
// Èç¹ûdisposing µÈÓÚfalse, ·½·¨ÒѾ±»ÖÕ½áÆ÷
finalizer ´ÓÄÚ²¿µ÷Óùý£¬
//Äã¾Í²»ÄÜÔÚÒýÓÃÆäËû¶ÔÏó£¬Ö»ÓзÇÍйÜ×ÊÔ´
¿ÉÒÔ±»ÊÍ·Å¡£
protectedvirtualvoid Dispose(bool disposing)
{
// ¼ì²éDispose ÊÇ·ñ±»µ÷Óùý.
if (!this.disposed)
{
// Èç¹ûµÈÓÚtrue, ÊÍ·ÅËùÓÐÍйܺͷÇÍйÜ×ÊÔ´
if (disposing)
{
// ÊÍ·ÅÍйÜ×ÊÔ´.
Components.Dispose();
}
// ÊÍ·Å·ÇÍйÜ×ÊÔ´£¬Èç¹ûdisposingΪ false,
// Ö»»áÖ´ÐÐÏÂÃæµÄ´úÂë.
CloseHandle(handle);
handle = IntPtr.Zero;
// ×¢ÒâÕâÀïÊÇ·ÇḬ̈߳²È«µÄ.
// ÔÚÍйÜ×ÊÔ´ÊÍ·ÅÒÔºó¿ÉÒÔÆô¶¯ÆäËüÏß³ÌÏú»Ù¶ÔÏó£¬
// µ«ÊÇÔÚdisposed±ê¼ÇÉèÖÃΪtrueǰ
// Èç¹ûḬ̈߳²È«ÊDZØÐëµÄ£¬¿Í»§¶Ë±ØÐëʵÏÖ¡£
}
disposed =true;
}
// ʹÓÃinterop µ÷Ó÷½·¨
// Çå³ý·ÇÍйÜ×ÊÔ´.
[System.Runtime.InteropServices.DllImport
("Kernel32")]
privateexternstatic Boolean CloseHandle
(IntPtr handle);
// ʹÓÃC# Îö¹¹º¯ÊýÀ´ÊµÏÖÖÕ½áÆ÷´úÂë
// Õâ¸öÖ»ÔÚDispose·½·¨Ã»±»µ÷ÓõÄǰÌáÏ£¬
²ÅÄܵ÷ÓÃÖ´ÐС£
// Èç¹ûÄã¸ø»ùÀàÖÕ½áµÄ»ú»á.
// ²»Òª¸ø×ÓÀàÌṩÎö¹¹º¯Êý.
~BaseResource()
{
// ²»ÒªÖظ´´´½¨ÇåÀíµÄ´úÂë.
// »ùÓÚ¿É¿¿ÐԺͿÉά»¤ÐÔ¿¼ÂÇ£¬µ÷ÓÃDispose
(false) ÊÇ×î¼ÑµÄ·½Ê½
Dispose(false);
}
// ÔÊÐíÄã¶à´Îµ÷ÓÃDispose·½·¨,
// µ«ÊÇ»áÅ׳öÒì³£Èç¹û¶ÔÏóÒѾÊÍ·Å¡£
// ²»ÂÛÄãʲôʱ¼ä´¦Àí¶ÔÏó¶¼»áºË²é¶ÔÏóµÄÊÇ·ñÊÍ·Å,
// check to see if it has been disposed.
publicvoid DoSomething()
{
if (this.disposed)
{
thrownew ObjectDisposedException();
}
}
// ²»ÒªÉèÖ÷½·¨Îªvirtual.
// ¼Ì³ÐÀ಻ÔÊÐíÖØÐ´Õâ¸ö·½·¨
publicvoid Close()
{
// ÎÞ²ÎÊýµ÷ÓÃDispose²ÎÊý.
Dispose();
}
publicstaticvoid Main()
{
// Insert code here to create
// and use a BaseResource object.
}
} |
GC.Collect() ·½·¨
×÷ÓãºÇ¿ÖƽøÐÐÀ¬»ø»ØÊÕ¡£
GCµÄ·½·¨£º
GC×¢ÒâÊÂÏ
1¡¢Ö»¹ÜÀíÄڴ棬·ÇÍйÜ×ÊÔ´£¬ÈçÎļþ¾ä±ú£¬GDI×ÊÔ´£¬Êý¾Ý¿âÁ¬½ÓµÈ»¹ÐèÒªÓû§È¥¹ÜÀí¡£
2¡¢Ñ»·ÒýÓã¬Íø×´½á¹¹µÈµÄʵÏÖ»á±äµÃ¼òµ¥¡£GCµÄ±êÖ¾-ѹËõËã·¨ÄÜÓÐЧµÄ¼ì²âÕâЩ¹ØÏµ£¬²¢½«²»ÔÙ±»ÒýÓõÄÍø×´½á¹¹ÕûÌåɾ³ý¡£
3¡¢GCͨ¹ý´Ó³ÌÐòµÄ¸ù¶ÔÏó¿ªÊ¼±éÀúÀ´¼ì²âÒ»¸ö¶ÔÏóÊÇ·ñ¿É±»ÆäËû¶ÔÏó·ÃÎÊ£¬¶ø²»ÊÇÓÃÀàËÆÓÚCOMÖеÄÒýÓüÆÊý·½·¨¡£
4¡¢GCÔÚÒ»¸ö¶ÀÁ¢µÄÏß³ÌÖÐÔËÐÐÀ´É¾³ý²»ÔÙ±»ÒýÓõÄÄÚ´æ¡£
5¡¢GCÿ´ÎÔËÐÐʱ»áѹËõÍйܶѡ£
6¡¢Äã±ØÐë¶Ô·ÇÍйÜ×ÊÔ´µÄÊͷŸºÔ𡣿ÉÒÔͨ¹ýÔÚÀàÐÍÖж¨ÒåFinalizerÀ´±£Ö¤×ÊÔ´µÃµ½ÊÍ·Å¡£
7¡¢¶ÔÏóµÄFinalizer±»Ö´ÐеÄʱ¼äÊÇÔÚ¶ÔÏó²»ÔÙ±»ÒýÓúóµÄij¸ö²»È·¶¨µÄʱ¼ä¡£×¢Òâ²¢·ÇºÍC++ÖÐÒ»ÑùÔÚ¶ÔÏ󳬳öÉùÃ÷ÖÜÆÚʱÁ¢¼´Ö´ÐÐÎö¹¹º¯Êý
8¡¢FinalizerµÄʹÓÃÓÐÐÔÄÜÉϵĴú¼Û¡£ÐèÒªFinalizationµÄ¶ÔÏó²»»áÁ¢¼´±»Çå³ý£¬¶øÐèÒªÏÈÖ´ÐÐFinalizer.Finalizer£¬²»ÊÇÔÚGCÖ´ÐеÄÏ̱߳»µ÷Óá£GC°Ñÿһ¸öÐèÒªÖ´ÐÐFinalizerµÄ¶ÔÏó·Åµ½Ò»¸ö¶ÓÁÐÖÐÈ¥£¬È»ºóÆô¶¯ÁíÒ»¸öÏß³ÌÀ´Ö´ÐÐËùÓÐÕâЩFinalizer£¬¶øGCÏ̼߳ÌÐøÈ¥É¾³ýÆäËû´ý»ØÊյĶÔÏó¡£ÔÚÏÂÒ»¸öGCÖÜÆÚ£¬ÕâЩִÐÐÍêFinalizerµÄ¶ÔÏóµÄÄÚ´æ²Å»á±»»ØÊÕ¡£
9¡¢.NET GCʹÓÃ"´ú"(generations)µÄ¸ÅÄîÀ´ÓÅ»¯ÐÔÄÜ¡£´ú°ïÖúGC¸üѸËÙµÄʶ±ðÄÇЩ×î¿ÉÄܳÉΪÀ¬»øµÄ¶ÔÏó¡£ÔÚÉÏ´ÎÖ´ÐÐÍêÀ¬»ø»ØÊÕºóд´½¨µÄ¶ÔÏóΪµÚ0´ú¶ÔÏó¡£¾ÀúÁËÒ»´ÎGCÖÜÆÚµÄ¶ÔÏóΪµÚ1´ú¶ÔÏó¡£¾ÀúÁËÁ½´Î»ò¸ü¶àµÄGCÖÜÆÚµÄ¶ÔÏóΪµÚ2´ú¶ÔÏó¡£´úµÄ×÷ÓÃÊÇΪÁËÇø·Ö¾Ö²¿±äÁ¿ºÍÐèÒªÔÚÓ¦ÓóÌÐòÉú´æÖÜÆÚÖÐÒ»Ö±´æ»îµÄ¶ÔÏ󡣴󲿷ֵÚ0´ú¶ÔÏóÊǾֲ¿±äÁ¿¡£³ÉÔ±±äÁ¿ºÍÈ«¾Ö±äÁ¿ºÜ¿ì±ä³ÉµÚ1´ú¶ÔÏó²¢×îÖÕ³ÉΪµÚ2´ú¶ÔÏó¡£
10¡¢GC¶Ô²»Í¬´úµÄ¶ÔÏóÖ´Ðв»Í¬µÄ¼ì²é²ßÂÔÒÔÓÅ»¯ÐÔÄÜ¡£Ã¿¸öGCÖÜÆÚ¶¼»á¼ì²éµÚ0´ú¶ÔÏó¡£´óÔ¼1/10µÄGCÖÜÆÚ¼ì²éµÚ0´úºÍµÚ1´ú¶ÔÏó¡£´óÔ¼1/100µÄGCÖÜÆÚ¼ì²éËùÓеĶÔÏó¡£ÖØÐÂ˼¿¼FinalizationµÄ´ú¼Û£ºÐèÒªFinalizationµÄ¶ÔÏó¿ÉÄܱȲ»ÐèÒªFinalizationÔÚÄÚ´æÖÐÍ£Áô¶îÍâ9¸öGCÖÜÆÚ¡£Èç¹û´ËʱËü»¹Ã»Óб»Finalize£¬¾Í±ä³ÉµÚ2´ú¶ÔÏ󣬴ӶøÔÚÄÚ´æÖÐÍ£Áô¸ü³¤Ê±¼ä¡£ |