引言
Javaçš„å †æ˜¯ä¸€ä¸ªè¿è¡Œæ—¶æ•°æ®åŒ?SPAN lang=EN-US>,¾cÈš„实例(对象)从ä¸åˆ†é…½Iºé—´ã€?SPAN lang=EN-US>Java虚拟æœ?SPAN lang=EN-US>(JVM)çš„å †ä¸å‚¨å˜ç€æ£åœ¨˜qè¡Œçš„åº”ç”¨ç¨‹åºæ‰€å»ºç«‹çš„æ‰€æœ‰å¯¹è±¡ï¼Œ˜q™äº›å¯¹è±¡é€šè¿‡newã€?SPAN lang=EN-US>newarrayã€?SPAN lang=EN-US>anewarrayå’?SPAN lang=EN-US>multianewarray½{‰æŒ‡ä»¤å¾ç«‹ï¼Œä½†æ˜¯å®ƒä»¬ä¸éœ€è¦ç¨‹åºä»£ç æ¥æ˜‘ּ地释放。一般æ¥è¯ß_¼Œå †çš„æ˜¯ç”±åžƒåœ¾å›žæ”¶ æ¥è´Ÿè´£çš„åQŒå°½½Ž?SPAN lang=EN-US>JVM规范òq¶ä¸è¦æ±‚ç‰ÒŽ®Šçš„垃圑֛žæ”¶æŠ€æœ¯ï¼Œç”šè‡³æ ÒŽœ¬ž®×ƒ¸éœ€è¦åžƒåœ‘Ö›žæ”Óž¼Œä½†æ˜¯ç”׃ºŽå†…å˜çš„æœ‰é™æ€§ï¼ŒJVM在实现的时候都有一个由垃圾回收所½Ž¡ç†çš„å †ã€‚åžƒåœ‘Ö›žæ”¶æ˜¯ä¸€¿U动æ€å˜å‚¨ç®¡ç†æŠ€æœ¯ï¼Œå®ƒè‡ªåŠ¨åœ°é‡Šæ”¾ä¸å†è¢«ç¨‹åºå¼•用的对象åQŒæŒ‰ç…§ç‰¹å®šçš„垃圾攉™›†½Ž—法æ¥å®žçŽ°èµ„æºè‡ªåŠ¨å›žæ”¶çš„åŠŸèƒ½ã€?SPAN lang=EN-US>
垃圾攉™›†çš„æ„ä¹?SPAN lang=EN-US>
åœ?SPAN lang=EN-US>C++ä¸ï¼Œå¯¹è±¡æ‰€å 的内å˜åœ¨ç¨‹åºç»“æŸè¿è¡Œä¹‹å‰ä¸€ç›´è¢«å 用åQŒåœ¨æ˜Žç¡®é‡Šæ”¾ä¹‹å‰ä¸èƒ½åˆ†é…¾l™å…¶å®ƒå¯¹è±¡ï¼›è€Œåœ¨Javaä¸ï¼Œå½“没有对象引用指å‘原先分é…ç»™æŸä¸ªå¯¹è±¡çš„å†…å˜æ—¶åQŒè¯¥å†…å˜ä¾¿æˆä¸ºåžƒåœ¾ã€?SPAN lang=EN-US>JVM的一个系¾lŸçñ”¾U¿ç¨‹ä¼šè‡ªåŠ¨é‡Šæ”¾è¯¥å†…å˜å—。垃圾收集æ„味瀽E‹åºä¸å†éœ€è¦çš„对象æ˜?SPAN lang=EN-US>"æ— ç”¨ä¿¡æ¯"åQŒè¿™äº›ä¿¡æ¯å°†è¢«ä¸¢å¼ƒã€‚当一个对象ä¸å†è¢«å¼•用的时候,内å˜å›žæ”¶å®ƒå 领的½Iºé—´åQŒä»¥ä¾¿ç©ºé—´è¢«åŽæ¥çš„æ–°å¯¹è±¡ä½¿ç”¨ã€‚事实上åQŒé™¤äº†é‡Šæ”¾æ²¡ç”¨çš„对象åQŒåžƒåœ¾æ”¶é›†ä¹Ÿå¯ä»¥æ¸…除内å˜è®°å½•¼„Žç‰‡ã€‚由于创建对象和垃圾攉™›†å™¨é‡Šæ”¾ä¸¢å¼ƒå¯¹è±¡æ‰€å 的内嘽Iºé—´åQŒå†…å˜ä¼šå‡ºçް¼„Žç‰‡ã€‚碎片是分酾l™å¯¹è±¡çš„内å˜å—之间的½Iºé—²å†…嘋zžã€‚碎片整ç†å°†æ‰€å ç”¨çš„å †å†…å˜¿UÕdˆ°å †çš„一端,JVMž®†æ•´ç†å‡ºçš„内å˜åˆ†é…给新的对象ã€?SPAN lang=EN-US>
垃圾攉™›†èƒ½è‡ªåŠ¨é‡Šæ”‘Ö†…å˜ç©ºé—ß_¼Œå‡è½»¾~–程的负担。这ä½?SPAN lang=EN-US>Java 虚拟机具有一些优ç‚V€‚首先,它能使编½E‹æ•ˆçއæé«˜ã€‚在没有垃圾攉™›†æœºåˆ¶çš„æ—¶å€™ï¼Œå¯èƒ½è¦èŠ±è®¸å¤šæ—‰™—´æ¥è§£å†³ä¸€ä¸ªé𾿇‚çš„å˜å‚¨å™¨é—®é¢˜ã€‚在ç”?SPAN lang=EN-US>Javaè¯è¨€¾~–程的时候,é 垃圾收集机制å¯å¤§å¤§¾~©çŸæ—‰™—´ã€‚å…¶‹Æ¡æ˜¯å®ƒä¿æŠ¤ç¨‹åºçš„完整æ€?SPAN lang=EN-US>, 垃圾攉™›†æ˜?SPAN lang=EN-US>Javaè¯è¨€å®‰å…¨æ€§ç–略的一个é‡è¦éƒ¨ä»½ã€?SPAN lang=EN-US>
垃圾攉™›†çš„一个潜在的¾~ºç‚¹æ˜¯å®ƒçš„开销影哽E‹åºæ€§èƒ½ã€?SPAN lang=EN-US>Java虚拟机必™å»è¿½ítªè¿è¡Œç¨‹åºä¸æœ‰ç”¨çš„对è±?SPAN lang=EN-US>, 而且最¾lˆé‡Šæ”¾æ²¡ç”¨çš„对象。这一个过½E‹éœ€è¦èŠ±è´¹å¤„ç†å™¨çš„æ—¶é—´ã€‚å…¶‹Æ¡åžƒåœ¾æ”¶é›†ç®—法的ä¸å®Œå¤‡æ€§ï¼Œæ—©å…ˆé‡‡ç”¨çš„æŸäº›åžƒåœ¾æ”¶é›†ç®—æ³•å°±ä¸èƒ½ä¿è¯100%攉™›†åˆ°æ‰€æœ‰çš„废弃内å˜ã€‚当焉™šç€åžƒåœ¾æ”‰™›†½Ž—æ³•çš„ä¸æ–改˜q›ä»¥åŠèÊY¼‹¬äšg˜qè¡Œæ•ˆçŽ‡çš„ä¸æ–æå‡ï¼Œ˜q™äº›é—®é¢˜éƒ½å¯ä»¥è¿Žåˆƒè€Œè§£ã€?SPAN lang=EN-US>
垃圾攉™›†çš„算法分æž?SPAN lang=EN-US>
Javaè¯è¨€è§„范没有明确地说æ˜?SPAN lang=EN-US>JVM使用哪ç§åžƒåœ¾å›žæ”¶½Ž—法åQŒä½†æ˜¯ä“Q何一¿U垃圾收集算法一般è¦å?SPAN lang=EN-US>2件基本的事情åQšï¼ˆ1åQ‰å‘çŽ°æ— ç”¨ä¿¡æ¯å¯¹è±¡ï¼›åQ?SPAN lang=EN-US>2åQ‰å›žæ”¶è¢«æ— 用对象å 用的内å˜ç©ºé—ß_¼Œä½¿è¯¥½Iºé—´å¯è¢«½E‹åºå†æ¬¡ä½¿ç”¨ã€?SPAN lang=EN-US>
大多数垃圑֛žæ”¶ç®—法ä‹Éç”¨äº†æ šw›†(root set)˜q™ä¸ªæ¦‚念åQ›æ‰€è°“æ ¹é›†å°±é‡æ£åœ¨æ‰§è¡Œçš„Java½E‹åºå¯ä»¥è®‰K—®çš„引用å˜é‡çš„集åˆ(包括局部å˜é‡ã€å‚æ•°ã€ç±»å˜é‡)åQŒç¨‹åºå¯ä»¥ä‹É用引用å˜é‡è®¿é—®å¯¹è±¡çš„属性和调用对象的方法。垃圾收集首选需è¦ç¡®å®šä»Žæ ¹å¼€å§‹å“ªäº›æ˜¯å¯è¾¾çš„和哪些是ä¸å¯è¾¾çš„ï¼Œä»Žæ ¹é›†å¯è¾„¡š„对象都是‹zÕdŠ¨å¯¹è±¡åQŒå®ƒä»¬ä¸èƒ½ä½œä¸ºåžƒåœ¾è¢«å›žæ”¶åQŒè¿™ä¹ŸåŒ…æ‹¬ä»Žæ šw›†é—´æŽ¥å¯è¾¾çš„å¯¹è±¡ã€‚è€Œæ ¹é›†é€šè¿‡ä»ÀL„路径ä¸å¯è¾„¡š„对象½W¦åˆåžƒåœ¾æ”‰™›†çš„æ¡ä»Óž¼Œåº”该被回收。下é¢ä»‹¾lå‡ ä¸ªå¸¸ç”¨çš„½Ž—法ã€?SPAN lang=EN-US>
1�SPAN style="FONT: 7pt 'Times New Roman'"> 引用计数�/SPAN>(Reference Counting Collector)
å¼•ç”¨è®¡æ•°æ³•æ˜¯å”¯ä¸€æ²¡æœ‰ä½¿ç”¨æ šw›†çš„垃圑֛žæ”¶çš„æ³•,该算法ä‹É用引用计数器æ¥åŒºåˆ†å˜‹zÕd¯¹è±¡å’Œä¸å†ä½¿ç”¨çš„对象。一般æ¥è¯ß_¼Œå †ä¸çš„æ¯ä¸ªå¯¹è±¡å¯¹åº”ä¸€ä¸ªå¼•ç”¨è®¡æ•°å™¨ã€‚å½“æ¯ä¸€‹Æ¡åˆ›å»ÞZ¸€ä¸ªå¯¹è±¡åƈ赋给一个å˜é‡æ—¶åQŒå¼•用计数器¾|®äØ“1。当对象被赋¾l™ä“Qæ„å˜é‡æ—¶åQŒå¼•ç”¨è®¡æ•°å™¨æ¯æ¬¡åŠ?SPAN lang=EN-US>1当对象出了作用域å?SPAN lang=EN-US>(该对象丢弃ä¸å†ä‹Éç”?SPAN lang=EN-US>)åQŒå¼•用计数器å‡?SPAN lang=EN-US>1åQŒä¸€æ—¦å¼•用计数器ä¸?SPAN lang=EN-US>0åQŒå¯¹è±¡å°±æ»¡èƒö了垃圾收集的æ¡äšgã€?/SPAN>
åŸÞZºŽå¼•用计数器的垃圾攉™›†å™¨è¿è¡Œè¾ƒå¿«ï¼Œä¸ä¼šé•¿æ—¶é—´ä¸æ–ç¨‹åºæ‰§è¡Œï¼Œé€‚宜地必™å?实时˜q行的程åºã€‚ä½†å¼•ç”¨è®¡æ•°å™¨å¢žåŠ äº†½E‹åºæ‰§è¡Œçš„开销åQŒå› 为毋ơ对象赋¾l™æ–°çš„å˜é‡ï¼Œè®¡æ•°å™¨åŠ 1åQŒè€Œæ¯‹Æ¡çŽ°æœ‰å¯¹è±¡å‡ºäº†ä½œç”¨åŸŸç”Ÿï¼Œè®¡æ•°å™¨å‡1ã€?/SPAN>
2ã€?SPAN lang=EN-US style="COLOR: red">tracing½Ž—法(Tracing Collector)
tracing½Ž—æ³•æ˜¯äØ“äº†è§£å†›_¼•用计数法的问题而æå‡ºï¼Œå®ƒä‹Éç”¨äº†æ šw›†çš„æ¦‚å¿üc€‚基äº?SPAN lang=EN-US>tracing½Ž—æ³•çš„åžƒåœ¾æ”¶é›†å™¨ä»Žæ ¹é›†å¼€å§‹æ‰«æï¼Œè¯†åˆ«å‡ºå“ªäº›å¯¹è±¡å¯è¾¾ï¼Œå“ªäº›å¯¹è±¡ä¸å¯è¾¾ï¼Œòq¶ç”¨æŸç§æ–¹å¼æ ‡è®°å¯è¾¾å¯¹è±¡åQŒä¾‹å¦‚对æ¯ä¸ªå¯è¾¾å¯¹è±¡è®„¡½®ä¸€ä¸ªæˆ–多个ä½ã€‚在扫æè¯†åˆ«˜q‡ç¨‹ä¸ï¼ŒåŸÞZºŽtracing½Ž—法的垃圾收集也¿UîCØ“æ ‡è®°å’Œæ¸…é™?SPAN lang=EN-US>(mark-and-sweep)垃圾攉™›†å™?SPAN lang=EN-US>.
3ã€?SPAN lang=EN-US style="COLOR: red">compacting½Ž—法(Compacting Collector)
ä¸ÞZº†è§£å†³å †ç¢Žç‰‡é—®é¢˜ï¼ŒåŸÞZºŽtracing的垃圑֛žæ”¶å¸æ”¶äº†Compacting½Ž—æ³•çš„æ€æƒ³åQŒåœ¨æ¸…除的过½E‹ä¸åQŒç®—法将所有的对象¿UÕdˆ°å †çš„ä¸€ç«¯ï¼Œå †çš„å¦ä¸€ç«¯å°±å˜æˆäº†ä¸€ä¸ªç›¸é‚Èš„½Iºé—²å†…å˜åŒºï¼Œæ”‰™›†å™¨ä¼šå¯¹å®ƒ¿UÕdŠ¨çš„æ‰€æœ‰å¯¹è±¡çš„æ‰€æœ‰å¼•ç”¨è¿›è¡Œæ›´æ–ŽÍ¼Œä½¿å¾—˜q™äº›å¼•用在新的佾|®èƒ½è¯†åˆ«åŽŸæ¥ çš„å¯¹è±¡ã€‚åœ¨åŸÞZºŽCompacting½Ž—法的收集器的实çŽîC¸åQŒä¸€èˆ¬å¢žåР奿Ÿ„å’Œå¥æŸ„表。  
4ã€?SPAN lang=EN-US style="COLOR: red">copying½Ž—法(Coping Collector)
该算法的æå‡ºæ˜¯äؓ了克æœå¥æŸ„的开销和解军_ †¼„Žç‰‡çš„垃圑֛žæ”¶ã€‚å®ƒå¼€å§‹æ—¶æŠŠå †åˆ†æˆ ä¸€ä¸ªå¯¹è±?é¢å’Œå¤šä¸ª½Iºé—²é¢ï¼Œ ½E‹åºä»Žå¯¹è±¡é¢ä¸ºå¯¹è±¡åˆ†é…空é—ß_¼Œå½“对象满了,åŸÞZºŽcoping½Ž—法的垃åœ?攉™›†ž®×ƒ»Žæ šw›†ä¸æ‰«ææ´»åŠ¨å¯¹è±¡ï¼Œòq¶å°†æ¯ä¸ª ‹zÕdŠ¨å¯¹è±¡å¤åˆ¶åˆ°ç©ºé—²é¢(使得‹zÕdŠ¨å¯¹è±¡æ‰€å 的内å˜ä¹‹é—´æ²¡æœ‰½Iºé—²‹z?SPAN lang=EN-US>)åQŒè¿™æ ïL©ºé—²é¢å˜æˆäº†å¯¹è±¡é¢åQŒåŽŸæ¥çš„对象é¢å˜æˆäº†½Iºé—²é¢ï¼Œ½E‹åºä¼šåœ¨æ–°çš„对象é¢ä¸åˆ†é…内å˜ã€?SPAN lang=EN-US>
一¿U典型的åŸÞZºŽcoping½Ž—法的垃圑֛žæ”¶æ˜¯stop-and-copy½Ž—法åQŒå®ƒž®†å †åˆ†æˆå¯¹è±¡é¢å’Œ½Iºé—²åŒºåŸŸé¢ï¼Œåœ¨å¯¹è±¡é¢ä¸Žç©ºé—²åŒºåŸŸé¢çš„切æ¢è¿‡½E‹ä¸åQŒç¨‹åºæš‚åœæ‰§è¡Œã€?SPAN lang=EN-US>
5ã€?SPAN lang=EN-US style="COLOR: red">generation½Ž—法(Generational Collector)
  stop-and-copy垃圾攉™›†å™¨çš„一个缺é™äh˜¯æ”‰™›†å™¨å¿…™åÕd¤åˆ¶æ‰€æœ‰çš„‹zÕdŠ¨å¯¹è±¡åQŒè¿™å¢žåŠ äº†ç¨‹åºç‰å¾…æ—¶é—ß_¼Œ˜q™æ˜¯coping½Ž—æ³•ä½Žæ•ˆçš„åŽŸå› ã€‚åœ¨½E‹åºè®¾è®¡ä¸æœ‰˜q™æ ·çš„规律:多数对象å˜åœ¨çš„æ—¶é—´æ¯”较çŸåQŒå°‘æ•°çš„å˜åœ¨æ—‰™—´æ¯”较é•Ñ€‚å› æ¤ï¼Œgeneration½Ž—法ž®†å †åˆ†æˆä¸¤ä¸ªæˆ–多个,æ¯ä¸ªåå †ä½œäØ“å¯¹è±¡çš„ä¸€ä»?SPAN lang=EN-US>(generation)。由于多数对象å˜åœ¨çš„æ—‰™—´æ¯”较çŸï¼Œéšç€½E‹åºä¸¢å¼ƒä¸ä‹É用的对象åQŒåžƒåœ¾æ”¶é›†å™¨ž®†ä»Žæœ€òq´è½»çš„åå †ä¸æ”‰™›†˜q™äº›å¯¹è±¡ã€‚在分代å¼çš„垃圾攉™›†å™¨è¿è¡ŒåŽåQŒä¸Š‹Æ¡è¿è¡Œå˜‹zÖM¸‹æ¥çš„对象¿UÕdˆ°ä¸‹ä¸€æœ€é«˜ä»£çš„åå †ä¸åQŒç”±äºŽè€ä¸€ä»£çš„åå †ä¸ä¼š¾l常被回æ”Óž¼Œå› 而节çœäº†æ—‰™—´ã€?SPAN lang=EN-US>
6ã€?SPAN lang=EN-US style="COLOR: red">adaptive½Ž—法(Adaptive Collector)
在特定的情况下,一些垃圾收集算法会优于其它½Ž—法。基äº?SPAN lang=EN-US>Adaptive½Ž—法的垃圾收集器ž®±æ˜¯ç›‘控当å‰å †çš„使用情况åQŒåƈž®†é€‰æ‹©é€‚当½Ž—法的垃圾收集器ã€?SPAN lang=EN-US>
é€è§†Java垃圾回收
1ã€å‘½ä»¤è¡Œå‚æ•°é€è§†åžƒåœ¾æ”‰™›†å™¨çš„˜q行
2ã€ä‹Éç”?SPAN lang=EN-US>System.gc()å¯ä»¥ä¸ç®¡JVM使用的是哪一¿U垃圑֛žæ”¶çš„½Ž—法åQŒéƒ½å¯ä»¥è¯äh±‚Java的垃圑֛žæ”¶ã€‚在命ä×oè¡Œä¸æœ‰ä¸€ä¸ªå‚æ•?SPAN lang=EN-US>-verbosegcå¯ä»¥æŸ¥çœ‹Javaä½¿ç”¨çš„å †å†…å˜çš„æƒ…å†µï¼Œå®ƒçš„æ ¼å¼å¦‚下åQ?SPAN lang=EN-US>
java -verbosegc classfile
  å¯ä»¥çœ‹ä¸ªä¾‹ååQ?/SPAN>
class TestGC
{
 public static void main(String[] args)
 {
  new TestGC();
  System.gc();
  System.runFinalization();
 }
}
  在这个例åä¸åQŒä¸€ä¸ªæ–°çš„对象被创å¾åQŒç”±äºŽå®ƒæ²¡æœ‰ä½¿ç”¨åQŒæ‰€ä»¥è¯¥å¯¹è±¡˜q…速地å˜äØ“å¯è¾¾åQŒç¨‹åºç¼–译åŽåQŒæ‰§è¡Œå‘½ä»¤ï¼š java -verbosegc TestGC åŽç»“æžœäØ“åQ?SPAN lang=EN-US>
[Full GC 168K->97K(1984K), 0.0253873 secs]
ã€€ã€€æœºå™¨çš„çŽ¯å¢ƒäØ“åQ?SPAN lang=EN-US>Windows 2000 + JDK
  2ã€?SPAN lang=EN-US>finalizeæ–ÒŽ³•é€è§†åžƒåœ¾æ”‰™›†å™¨çš„˜q行
  åœ?SPAN lang=EN-US>JVM垃圾攉™›†å™¨æ”¶é›†ä¸€ä¸ªå¯¹è±¡ä¹‹å‰?åQŒä¸€èˆ¬è¦æ±‚程åºè°ƒç”¨é€‚当的方法释放资æºï¼Œä½†åœ¨æ²¡æœ‰æ˜Žç¡®é‡Šæ”¾èµ„æºçš„æƒ…况下åQ?SPAN lang=EN-US>Javaæä¾›äº†ç¼ºçœæœºåˆ¶æ¥¾lˆæ¢åŒ–该对象心释放资æºï¼Œ˜q™ä¸ªæ–ÒŽ³•ž®±æ˜¯finalizeåQˆï¼‰ã€‚å®ƒçš„åŽŸåž‹äØ“åQ?SPAN lang=EN-US>
protected void finalize() throws Throwable
  åœ?SPAN lang=EN-US>finalize()æ–ÒŽ³•˜q”回之åŽåQŒå¯¹è±¡æ¶ˆå¤±ï¼Œåžƒåœ¾æ”‰™›†å¼€å§‹æ‰§è¡Œã€‚原型ä¸çš?SPAN lang=EN-US>throws Throwable表示它å¯ä»¥æŠ›å‡ÞZ“Q何类型的异常ã€?SPAN lang=EN-US>
  之所以è¦ä½¿ç”¨finalize()åQŒæ˜¯ç”׃ºŽæœ‰æ—¶éœ€è¦é‡‡å–与Java的普通方法ä¸åŒçš„一¿U方法,通过分é…å†…å˜æ¥åšä¸€äº›å…·æœ?SPAN lang=EN-US>Cé£Žæ ¼çš„äº‹æƒ…ã€‚è¿™ä¸»è¦å¯ä»¥é€šè¿‡"固有æ–ÒŽ³•"æ¥è¿›è¡Œï¼Œå®ƒæ˜¯ä»?SPAN lang=EN-US>Java里调用éžJavaæ–ÒŽ³•的一¿Uæ–¹å¼ã€?SPAN lang=EN-US>Cå’?SPAN lang=EN-US>C++是目å‰å”¯ä¸€èŽ·å¾—å›ºæœ‰æ–ÒŽ³•支æŒçš„è¯a€ã€‚但ç”׃ºŽå®ƒä»¬èƒ½è°ƒç”¨é€šè¿‡å…¶ä»–è¯è¨€¾~–写的å½E‹åºåQŒæ‰€ä»¥èƒ½å¤Ÿæœ‰æ•ˆåœ°è°ƒç”¨ä»ÖM½•东西。在é?SPAN lang=EN-US>Java代ç 内部åQŒä¹Ÿè®¸èƒ½è°ƒç”¨Cçš?SPAN lang=EN-US>malloc()¾pÕdˆ—函数åQŒç”¨å®ƒåˆ†é…å˜å‚¨ç©ºé—´ã€‚而且除éžè°ƒç”¨äº?SPAN lang=EN-US>free()åQŒå¦åˆ™å˜å‚¨ç©ºé—´ä¸ä¼šå¾—åˆ°é‡Šæ”¾ï¼Œä»Žè€Œé€ æˆå†…å˜"æ¼æ´ž"的出现。当ç„Óž¼Œfree()是一ä¸?SPAN lang=EN-US>Cå’?SPAN lang=EN-US>C++函数åQŒæ‰€ä»¥æˆ‘们需è¦åœ¨finalize()内部的一个固有方法ä¸è°ƒç”¨å®ƒã€‚也ž®±æ˜¯è¯´æˆ‘们ä¸èƒ½è¿‡å¤šåœ°ä½¿ç”¨finalize()åQŒå®ƒòq¶ä¸æ˜¯è¿›è¡Œæ™®é€šæ¸…é™¤å·¥ä½œçš„ç†æƒ³åœºæ‰€ã€?SPAN lang=EN-US>
  在普通的清除工作ä¸ï¼Œä¸ºæ¸…除一个对象,那个对象的用户必™åÕdœ¨å¸Œæœ›˜q›è¡Œæ¸…除的地点调用一个清除方法。这ä¸?SPAN lang=EN-US>C++"ç ´åå™?SPAN lang=EN-US>"的概å¿ëŠ¨æœ‰æŠµè§¦ã€‚åœ¨C++ä¸ï¼Œæ‰€æœ‰å¯¹è±¡éƒ½ä¼šç ´å(清除åQ‰ã€‚或者æ¢å¥è¯è¯ß_¼Œæ‰€æœ‰å¯¹è±¡éƒ½"应该"ç ´å。若ž®?SPAN lang=EN-US>C++å¯¹è±¡åˆ›å¾æˆä¸€ä¸ªæœ¬åœ°å¯¹è±¡ï¼Œæ¯”å¦‚åœ¨å †æ ˆä¸åˆ›å¾åQˆåœ¨Java䏿˜¯ä¸å¯èƒ½çš„åQ‰ï¼Œé‚£ä¹ˆæ¸…é™¤æˆ–ç ´å工作就会在"¾l“æŸèŠ±æ‹¬å?SPAN lang=EN-US>"所代表的ã€åˆ›å»ø™¿™ä¸ªå¯¹è±¡çš„作用域的末尾˜q›è¡Œã€‚若对象是用new创å¾çš„(¾cÖM¼¼äº?SPAN lang=EN-US>JavaåQ‰ï¼Œé‚£ä¹ˆå½“程åºå‘˜è°ƒç”¨C++çš?SPAN lang=EN-US>delete命ä×oæ—Óž¼ˆJava没有˜q™ä¸ªå‘½ä×oåQ‰ï¼Œž®×ƒ¼šè°ƒç”¨ç›¸åº”çš„ç ´å器。若½E‹åºå‘˜å¿˜è®îCº†åQŒé‚£ä¹ˆæ°¸˜qœä¸ä¼šè°ƒç”¨ç ´å器åQŒæˆ‘们最¾lˆå¾—到的ž®†æ˜¯ä¸€ä¸ªå†…å?SPAN lang=EN-US>"æ¼æ´ž"åQŒå¦å¤–还包括对象的其他部分永˜qœä¸ä¼šå¾—到清除ã€?SPAN lang=EN-US>
  相ååQ?SPAN lang=EN-US>Javaä¸å…许我们创建本圎ͼˆå±€éƒ¨ï¼‰å¯¹è±¡--æ— è®ºå¦‚ä½•éƒ½è¦ä½¿ç”¨new。但åœ?SPAN lang=EN-US>Javaä¸ï¼Œæ²¡æœ‰"delete"命ä×oæ¥é‡Šæ”‘Ö¯¹è±¡ï¼Œå› äØ“åžƒåœ¾æ”‰™›†å™¨ä¼šå¸®åŠ©æˆ‘ä»¬è‡ªåŠ¨é‡Šæ”¾å˜å‚¨½Iºé—´ã€‚所以如果站在比较简化的立场åQŒæˆ‘们å¯ä»¥è¯´æ£æ˜¯ç”׃ºŽå˜åœ¨åžƒåœ¾æ”‰™›†æœºåˆ¶åQŒæ‰€ä»?SPAN lang=EN-US>Javaæ²¡æœ‰ç ´å器。然而,éšç€ä»¥åŽå¦ä¹ 的深入,ž®×ƒ¼šçŸ¥é“垃圾攉™›†å™¨çš„å˜åœ¨òq¶ä¸èƒ½å®Œå…¨æ¶ˆé™¤å¯¹ç ´å器的需è¦ï¼Œæˆ–者说ä¸èƒ½æ¶ˆé™¤å¯¹ç ´å器代表的那¿U机制的需è¦ï¼ˆè€Œä¸”¾l对ä¸èƒ½ç›´æŽ¥è°ƒç”¨finalize()åQŒæ‰€ä»¥åº”ž®½é‡é¿å…用它åQ‰ã€‚若希望执行除释攑֘储空间之外的其他æŸç§å½¢å¼çš„æ¸…除工作,ä»ç„¶å¿…须调用Javaä¸çš„一个方法。它½{‰ähäº?SPAN lang=EN-US>C++çš„ç ´å器åQŒåªæ˜¯æ²¡åŽè€…æ–¹ä¾Ñ€?SPAN lang=EN-US>
  下题q™ä¸ªä¾‹åå‘大家展½CÞZº†åžƒåœ¾æ”‰™›†æ‰€¾l历的过½E‹ï¼Œòq¶å¯¹å‰é¢çš„陈˜q°è¿›è¡Œäº†æ€È»“ã€?SPAN lang=EN-US>
class Chair {
 static boolean gcrun = false;
 static boolean f = false;
 static int created = 0;
 static int finalized = 0;
 int i;
 Chair() {
  i = ++created;
  if(created == 47)
   System.out.println("Created 47");
 }
 protected void finalize() {
  if(!gcrun) {
   gcrun = true;
   System.out.println("Beginning to finalize after " + created + " Chairs have been created");
  }
  if(i == 47) {
   System.out.println("Finalizing Chair #47, " +"Setting flag to stop Chair creation");
   f = true;
  }
  finalized++;
  if(finalized >= created)
   System.out.println("All " + finalized + " finalized");
 }
}
public class Garbage {
 public static void main(String[] args) {
  if(args.length == 0) {
   System.err.println("Usage: \n" + "java Garbage before\n or:\n" + "java Garbage after");
   return;
  }
  while(!Chair.f) {
   new Chair();
   new String("To take up space");
  }
  System.out.println("After all Chairs have been created:\n" + "total created = " + Chair.created +
", total finalized = " + Chair.finalized);
  if(args[0].equals("before")) {
    System.out.println("gc():");
    System.gc();
    System.out.println("runFinalization():");
    System.runFinalization();
  }
  System.out.println("bye!");
  if(args[0].equals("after"))
   System.runFinalizersOnExit(true);
 }
}
  上题q™ä¸ª½E‹åºåˆ›å¾äº†è®¸å¤?SPAN lang=EN-US>Chair对象åQŒè€Œä¸”在垃圾收集器开始è¿è¡ŒåŽçš„æŸäº›æ—¶å€™ï¼Œ½E‹åºä¼šåœæ¢åˆ›å»?SPAN lang=EN-US>Chair。由于垃圾收集器å¯èƒ½åœ¨ä“Q何时间è¿è¡Œï¼Œæ‰€ä»¥æˆ‘们ä¸èƒ½å‡†¼‹®çŸ¥é“它在何时å¯åŠ¨ã€‚å› æ¤ï¼Œ½E‹åºç”¨ä¸€ä¸ªåä¸?SPAN lang=EN-US>gcrunçš„æ ‡è®°æ¥æŒ‡å‡ºåžƒåœ¾æ”‰™›†å™¨æ˜¯å¦å·²¾l开始è¿è¡Œã€‚åˆ©ç”¨ç¬¬äºŒä¸ªæ ‡è®°fåQ?SPAN lang=EN-US>Chairå¯å‘Šè¯?SPAN lang=EN-US>main()å®ƒåº”åœæ¢å¯¹è±¡çš„生æˆã€‚è¿™ä¸¤ä¸ªæ ‡è®°éƒ½æ˜¯åœ?SPAN lang=EN-US>finalize()内部讄¡½®çš„,它调用于垃圾攉™›†æœŸé—´ã€‚å¦ä¸¤ä¸ªstaticå˜é‡--created以åŠfinalized--分别用于跟踪已创建的对象数é‡ä»¥åŠåžƒåœ¾æ”‰™›†å™¨å·²˜q›è¡Œå®Œæ”¶ž®‘Ö·¥ä½œçš„对象数é‡ã€‚最åŽï¼Œæ¯ä¸ªChair都有它自å·Þqš„åQˆéžstaticåQ?SPAN lang=EN-US>int iåQŒæ‰€ä»¥èƒ½è·Ÿè¸ªäº†è§£å®ƒå…·ä½“çš„¾~–å·æ˜¯å¤šž®‘。编å·äØ“47çš?SPAN lang=EN-US>Chair˜q›è¡Œå®Œæ”¶ž®‘Ö·¥ä½œåŽåQŒæ ‡è®îC¼šè®¾äØ“trueåQŒæœ€¾lˆç»“æ?SPAN lang=EN-US>Chairå¯¹è±¡çš„åˆ›å»ø™¿‡½E‹ã€‚(关于˜q™ä¸ªä¾‹å的更具体的分æžå’Œè¯´æ˜Žè¯·å‚看ã€?SPAN lang=EN-US>Java¾~–ç¨‹æ€æƒ³ã€‹çš„½W¬å››ç« )
  关于垃圾攉™›†çš„å‡ ç‚¹è¡¥å…?/B>
  ¾l过上述的说明,å¯ä»¥å‘çŽ°åžƒåœ¾å›žæ”¶æœ‰ä»¥ä¸‹çš„å‡ ä¸ªç‰¹ç‚¹åQ?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>1åQ‰åžƒåœ¾æ”¶é›†å‘生的ä¸å¯é¢„知性:ç”׃ºŽå®žçŽ°äº†ä¸åŒçš„垃圾攉™›†½Ž—法和采用了ä¸åŒçš„æ”¶é›†æœºåˆÓž¼Œæ‰€ä»¥å®ƒæœ‰å¯èƒ½æ˜¯å®šæ—¶å‘生åQŒæœ‰å¯èƒ½æ˜¯å½“出现¾pÈ»Ÿ½Iºé—²CPUèµ„æºæ—¶å‘生,也有å¯èƒ½æ˜¯å’ŒåŽŸå§‹çš„åžƒåœ¾æ”¶é›†ä¸€æ øP¼Œ½{‰åˆ°å†…å˜æ¶ˆè€—出现æžé™æ—¶å‘生åQŒè¿™ä¸Žåžƒåœ¾æ”¶é›†å™¨çš„选择和具体的讄¡½®éƒ½æœ‰å…³ç³»ã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>2åQ‰åžƒåœ¾æ”¶é›†çš„¾_„¡¡®æ€§ï¼šä¸»è¦åŒ…括2 个方é¢ï¼šåQ?SPAN lang=EN-US>aåQ‰åžƒåœ¾æ”¶é›†å™¨èƒ½å¤Ÿ¾_„¡¡®æ ‡è®°‹zȀ的对象;åQ?SPAN lang=EN-US>båQ‰åžƒåœ¾æ”¶é›†å™¨èƒ½å¤Ÿ¾_„¡¡®åœ°å®šä½å¯¹è±¡ä¹‹é—´çš„引用关系。å‰è€…æ˜¯å®Œå…¨åœ°å›žæ”¶æ‰€æœ‰åºŸå¼ƒå¯¹è±¡çš„å‰æåQŒå¦åˆ™å°±å¯èƒ½é€ æˆå†…å˜æ³„æ¼ã€‚而åŽè€…则是实现归òq¶å’Œå¤åˆ¶½{‰ç®—æ³•çš„å¿…è¦æ¡äšg。所有ä¸å¯è¾¾å¯¹è±¡éƒ½èƒ½å¤Ÿå¯é 地得到回收åQŒæ‰€æœ‰å¯¹è±¡éƒ½èƒ½å¤Ÿé‡æ–°åˆ†é…åQŒå…许对象的å¤åˆ¶å’Œå¯¹è±¡å†…å˜çš„¾~©åƈåQŒè¿™æ ·å°±æœ‰æ•ˆåœ°é˜²æ¢å†…å˜çš„æ”¯ç¦»ç ´ç¢Žã€‚(3åQ‰çŽ°åœ¨æœ‰è®¸å¤š¿Uä¸åŒçš„垃圾攉™›†å™¨ï¼Œæ¯ç§æœ‰å…¶½Ž—法且其表现å„异åQŒæ—¢æœ‰å½“垃圾攉™›†å¼€å§‹æ—¶ž®±åœæ¢åº”用程åºçš„˜q行åQŒåˆæœ‰å½“垃圾攉™›†å¼€å§‹æ—¶ä¹Ÿå…许应用程åºçš„¾U¿ç¨‹˜q行åQŒè¿˜æœ‰åœ¨åŒä¸€æ—‰™—´åžƒåœ¾æ”‰™›†å¤šçº¿½E‹è¿è¡Œã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>4åQ‰åžƒåœ¾æ”¶é›†çš„实现和具体的JVM 以åŠJVMçš„å†…å˜æ¨¡åž‹æœ‰éžå¸¸ç´§å¯†çš„å…³¾p…R€‚ä¸åŒçš„JVM å¯èƒ½é‡‡ç”¨ä¸åŒçš„垃圾收集,è€?SPAN lang=EN-US>JVM çš„å†…å˜æ¨¡åž‹å†³å®šç€è¯?SPAN lang=EN-US>JVMå¯ä»¥é‡‡ç”¨å“ªäº›¾cÕdž‹åžƒåœ¾æ”‰™›†ã€‚现在,HotSpot ¾pÕdˆ—JVMä¸çš„内嘾pÈ»Ÿéƒ½é‡‡ç”¨å…ˆ˜q›çš„é¢å‘对象的框架设计,˜q™ä‹É得该¾pÕdˆ—JVM都å¯ä»¥é‡‡ç”¨æœ€å…ˆè¿›çš„垃圾收集ã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>5åQ‰éšç€æŠ€æœ¯çš„å‘展åQŒçŽ°ä»£åžƒåœ¾æ”¶é›†æŠ€æœ¯æä¾›è®¸å¤šå¯é€‰çš„垃圾攉™›†å™¨ï¼Œè€Œä¸”在酾|®æ¯¿U收集器的时候åˆå¯ä»¥è®„¡½®ä¸åŒçš„傿•ŽÍ¼Œ˜q™å°±ä½¿å¾—æ ÒŽ®ä¸åŒçš„应用环境获得最优的应用性能æˆäØ“å¯èƒ½ã€?SPAN lang=EN-US>
  针对以上特点åQŒæˆ‘ä»¬åœ¨ä½¿ç”¨çš„æ—¶å€™è¦æ³¨æ„åQ?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>1åQ‰ä¸è¦è¯•囑֎»å‡å®šåžƒåœ¾æ”‰™›†å‘生的时é—ß_¼Œ˜q™ä¸€åˆ‡éƒ½æ˜¯æœªçŸ¥çš„。比如,æ–ÒŽ³•ä¸çš„一个äÍæ—¶å¯¹è±¡åœ¨æ–ÒŽ³•调用完毕åŽå°±å˜æˆäº†æ— 用对象,˜q™ä¸ªæ—¶å€™å®ƒçš„内å˜å°±å¯ä»¥è¢«é‡Šæ”¾ã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>2åQ?SPAN lang=EN-US>Javaä¸æä¾›äº†ä¸€äº›å’Œåžƒåœ¾æ”‰™›†æ‰“交é“çš„¾c»ï¼Œè€Œä¸”æä¾›äº†ä¸€¿U强行执行垃圾收集的æ–ÒŽ³•--调用System.gc()åQŒä½†˜q™åŒæ äh˜¯ä¸ªä¸¼‹®å®šçš„æ–¹æ³•ã€?SPAN lang=EN-US>Java ä¸åƈä¸ä¿è¯æ¯‹Æ¡è°ƒç”¨è¯¥æ–ÒŽ³•ž®×ƒ¸€å®šèƒ½å¤Ÿå¯åŠ¨åžƒåœ¾æ”¶é›†ï¼Œå®ƒåªä¸è¿‡ä¼šå‘JVMå‘出˜q™æ ·ä¸€ä¸ªç”³è¯øP¼Œåˆ°åº•是å¦çœŸæ£æ‰§è¡Œåžƒåœ¾æ”‰™›†åQŒä¸€åˆ‡éƒ½æ˜¯ä¸ªæœªçŸ¥æ•°ã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>3åQ‰æŒ‘选适åˆè‡ªå·±çš„垃圾收集器。一般æ¥è¯ß_¼Œå¦‚æžœ¾pÈ»Ÿæ²¡æœ‰ç‰ÒŽ®Šå’Œè‹›åˆÈš„æ€§èƒ½è¦æ±‚åQŒå¯ä»¥é‡‡ç”?SPAN lang=EN-US>JVM的缺çœé€‰é¡¹ã€‚å¦åˆ™å¯ä»¥è€ƒè™‘使用有针å¯ÒŽ€§çš„垃圾攉™›†å™¨ï¼Œæ¯”å¦‚å¢žé‡æ”‰™›†å™¨å°±æ¯”较适åˆå®žæ—¶æ€§è¦æ±‚较高的¾pÈ»Ÿä¹‹ä¸ã€‚ç³»¾lŸå…·æœ‰è¾ƒé«˜çš„é…ç½®åQŒæœ‰æ¯”较多的闲置资æºåQŒå¯ä»¥è€ƒè™‘使用òq¶è¡Œæ ‡è®°/清除攉™›†å™¨ã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>4åQ‰å…³é”®çš„也是难把æ¡çš„é—®é¢˜æ˜¯å†…å˜æ³„æ¼ã€‚良好的¾~–ç¨‹ä¹ æƒ¯å’Œä¸¥è°¨çš„¾~–程æ€åº¦æ°¸è¿œæ˜¯æœ€é‡è¦çš„,ä¸è¦è®©è‡ªå·Þqš„一个å°é”™è¯¯å¯ÆD‡´å†…å˜å‡ºçŽ°å¤§æ¼‹zžã€?SPAN lang=EN-US>
  åQ?SPAN lang=EN-US>5åQ‰å°½æ—©é‡Šæ”¾æ— 用对象的引用。大多数½E‹åºå‘˜åœ¨ä½¿ç”¨ä¸´æ—¶å˜é‡çš„æ—¶å€™ï¼Œéƒ½æ˜¯è®©å¼•用å˜é‡åœ¨é€€å‡ºæ´»åŠ¨åŸŸ(scope)åŽï¼Œè‡ªåŠ¨è®„¡½®ä¸?SPAN lang=EN-US>nullåQŒæš—½Cºåžƒåœ¾æ”¶é›†å™¨æ¥æ”¶é›†è¯¥å¯¹è±¡åQŒè¿˜å¿…须注æ„该引用的对象是å¦è¢«ç›‘å¬ï¼Œå¦‚果有,则è¦åŽÀLŽ‰ç›‘å¬å™¨ï¼Œç„¶åŽå†èµ‹½Iºå€¹{€?SPAN lang=EN-US>
  ¾l“æŸè¯?/B>
  一般æ¥è¯ß_¼ŒJavaå¼€å‘äh员å¯ä»¥ä¸é‡è§†JVMä¸å †å†…å˜çš„分é…å’Œåžƒåœ¾å¤„ç†æ”‰™›†åQŒä½†æ˜¯ï¼Œå……分ç†è§£Java的这一ç‰ÒŽ€§å¯ä»¥è®©æˆ‘们更有效地利用资æºã€‚åŒæ—¶è¦æ³¨æ„finalize()æ–ÒŽ³•æ˜?SPAN lang=EN-US>Javaçš„ç¼ºçœæœºåˆÓž¼Œæœ‰æ—¶ä¸ºç¡®ä¿å¯¹è±¡èµ„æºçš„æ˜Žç¡®é‡Šæ”¾åQŒå¯ä»¥ç¼–写自å·Þqš„finalizeæ–ÒŽ³•ã€?SPAN lang=EN-US>