ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一级视频在线观看,久久精品国产亚洲夜色AV网站,国产亚洲精品美女久久久http://m.tkk7.com/FinalFantasy/category/3675.html世界的å°ä¸–界åQŒæˆ‘的大世界^_^zh-cnWed, 28 Feb 2007 05:38:41 GMTWed, 28 Feb 2007 05:38:41 GMT60Java回收机制分æžhttp://m.tkk7.com/FinalFantasy/archive/2005/12/26/25474.htmlFinalFantasyFinalFantasyMon, 26 Dec 2005 09:46:00 GMThttp://m.tkk7.com/FinalFantasy/archive/2005/12/26/25474.htmlhttp://m.tkk7.com/FinalFantasy/comments/25474.htmlhttp://m.tkk7.com/FinalFantasy/archive/2005/12/26/25474.html#Feedback2http://m.tkk7.com/FinalFantasy/comments/commentRss/25474.htmlhttp://m.tkk7.com/FinalFantasy/services/trackbacks/25474.html

引言

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 + JDK1.3.1,½Ž­å¤´å‰åŽçš„æ•°æ?SPAN lang=EN-US>168Kå’?SPAN lang=EN-US>97K分别表示垃圾攉™›†GCå‰åŽæ‰€æœ‰å­˜‹zÕd¯¹è±¡ä‹É用的内存定w‡åQŒè¯´æ˜Žæœ‰168K-97K=71K的对象容é‡è¢«å›žæ”¶åQŒæ‹¬å·å†…的数æ?SPAN lang=EN-US>1984K为堆内存的æ€Õd®¹é‡ï¼Œæ”‰™›†æ‰€éœ€è¦çš„æ—‰™—´æ˜?SPAN lang=EN-US>0.0253873¿U’(˜q™ä¸ªæ—‰™—´åœ¨æ¯‹Æ¡æ‰§è¡Œçš„æ—¶å€™ä¼šæœ‰æ‰€ä¸åŒåQ‰ã€?SPAN lang=EN-US>

  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>

 

 

 



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÑÇÖÞAVÎÞÂë³ÉÈ˾«Æ·ÇøÀÇÈËÓ°Ôº| jizzÔÚÏßÃâ·Ñ²¥·Å| Ò»¼¶Ã«Æ¬**²»¿¨Ãâ·Ñ²¥| 99ÎÞÂëÈËÆÞÒ»Çø¶þÇøÈýÇøÃâ·Ñ| ÑÇÖÞA¢¥ÎÞÂë×¨ÇøÔÚÏß¹Û¿´q| ¾«Æ·¹ú²ú¸£ÀûÓÈÎïÃâ·Ñ| ÑÇÖÞ¹ú²úÃÀÅ®¾«Æ·¾Ã¾Ã¾Ã¾Ã¡à| ÑÇÖÞ¹ú²ú¾«Æ·18¾Ã¾Ã¾Ã¾Ã¾Ã| ³ÉÊìÅ®ÈËÉü½»Æ¬Ãâ·Ñ¹Û¿´ÊÓÆµ| ÑÇÖÞ¾«Æ·ÎÞÂë²»¿¨ÔÚÏß²¥·Å| Å®ÈË18ëƬa¼¶Ã«Æ¬Ãâ·ÑÊÓÆµ| ÑÇÖÞAVÎÞÂë¹ú²úÒ»Çø¶þÇøÈýÇø| ¹ú²úÒ»¼¶ÌػƸßÇåÃâ·Ñ´óƬ| ÑÇÖÞÈÕ±¾ÂÒÂëÒ»Çø¶þÇøÔÚÏß¶þ²úÏß| 99¾Ã9ÔÚÏß|Ãâ·Ñ| ÑÇÖÞavÓÀ¾ÃÎÞÂëºÙºÙºÙ| Ò»¼¶Ã«Æ¬²»¿¨Æ¬Ãâ·Ñ¹Û¿´| ÑÇÖÞ¹ú²ú¾«Æ·¾Ã¾Ã¾Ã¾Ã| ¹ú²ú91Ãâ·ÑÔÚÏß¹Û¿´| ºÝºÝÉ«ÏãæÃæÃ¾Ã¾ÃÑÇÖÞ¾«Æ·| Ãâ·Ñ¹Û¿´ÀíÂÛÆ¬Ã«Æ¬| ÄÐÄлÆGAYƬÃâ·ÑÍøÕ¾WWW| ¼¤Çé97×ÛºÏÑÇÖÞÉ«æÃæÃÎå| Ãâ·ÑÒ»¼¶²»¿¨Ã«Æ¬| ÑÇÖÞÒ»Çø¶þÇøÈýÇøÔÚÏß¹Û¿´ÃÛÌÒ| ÔÚÏß¹Û¿´Ãâ·ÑΪ³ÉÄêÊÓÆµ| ÈÕ±¾Ãâ·Ñ¾«Æ·Ò»Çø¶þÇøÈýÇø| ¹ú²úÑÇÖÞ¾«Æ·xxx| 2021Ãâ·ÑÈÕº«ÊÓÆµÍø| ÑÇÖÞa¡Å¹ú²úav×ÛºÏavÏÂÔØ | ¹ú²ú¾«²ÊÃâ·ÑÊÓÆµ| ÑÇÖÞavÈÕº«×ÛºÏÒ»Çø¾ÃÈÈ| ×ۺϾþþþþÃÖÐÎÄ×ÖÄ»ÑÇÖÞ¹ú²ú¹ú²ú×ÛºÏÒ»ÇøÊ× | ÑÇÖÞɫͼ×ÛºÏÔÚÏß| 69ÊÓÆµÔÚÏß¹Û¿´¸ßÇåÃâ·Ñ| ÑÇÖÞÅ·ÃÀÈÕº«×ۺϰ³È¥ÁË| ÑÇÖÞÒ»¼¶AvÎÞÂëëƬ¾Ã¾Ã¾«Æ·| ÎÞÂë¹ú²ú¾«Æ·Ò»Çø¶þÇøÃâ·Ñģʽ | ¹ú²ú¾«Æ·ÑÇÖÞavÉ«ÓûÈýÇø| ÐÔÉ«avÎÞÂëÃâ·ÑÒ»Çø¶þÇøÈýÇø| ÌØ¼¶aa**ëƬÃâ·Ñ¹Û¿´|