ÔÚJava³ÌÐòÉè¼ÆÖУ¬ÄÚ´æµÄÉêÇë¡¢·ÖÅä¡¢ÊͷŶ¼ÓÉJVM¸ºÔðÍê³É£¬Òò´Ë¿ª·¢ÈËÔ±¾ÍʡȥÁËÕⲿ·Ö¹¤×÷£¬²»¹ýÕâÒ²Òâζ×ÅËù¿ª·¢µÄÓ¦Óò»ÊÇ×îÓŵġ£¿ª·¢ÈËÔ±ÓбØÒª¶ÔJavaÓ¦Óÿª·¢ÖÐÓëÄÚ´æ¹ÜÀíÏà¹ØµÄ¼¼Êõ×öÒ»¶¨µÄÁ˽⡣
À¬»ø»ØÊÕ£¨Garbage Collection£©ÊÇJava³ÌÐòÉè¼ÆÖÐÄÚ´æ¹ÜÀíµÄºËÐĸÅÄÄÇôÔÚJVMÔËÐл·¾³ÖÐʲô¶ÔÏóÊÇÀ¬»øÄØ£¿
¶¨ÒåÈçÏ£ºÒ»¸ö¶ÔÏó´´½¨ºó±»·ÅÖÃÔÚJVMµÄ¶ÔÄڴ棨heap£©ÖУ¬µ±ÓÀÔ¶²»ÔÙÒýÓÃÕâ¸ö¶ÔÏóʱ£¬Ëü½«±»JVMÔÚ¶ÔÄÚ´æÖлØÊÕ¡£±»´´½¨µÄ¶ÔÏó²»ÄÜÔÙÉú£¬Í¬Ê±Ò²Ã»Óа취ͨ¹ý³ÌÐòÓï¾äÊÍ·ÅËüÃÇ¡£
ÎÒÃÇÒ²¿ÉÒÔÕâÑù¶¨Ò壺µ±¶ÔÏóÔÚJVMÔËÐпռäÖÐÎÞ·¨Í¨¹ý¸ù¼¯ºÏ£¨Root set£©µ½´ïʱ£¬Õâ¸ö¶ÔÏó¾Í±»³ÆÎªÀ¬»ø¶ÔÏ󡣸ù¼¯ºÏÊÇÓÉÀàÖеľ²Ì¬ÒýÓÃÓòÓë±¾µØÒýÓÃÓò×é³ÉµÄ¡£
JVM¹ÜÀíµÄÁ½ÖÖÀàÐ͵ÄÄڴ棺¶ÔÄڴ棨heap£©ºÍÕ»Äڴ棨stack£©¡£¶ÑÄÚ´æÖ÷ÒªÓÃÀ´´æ´¢³ÌÐòÔÚÔËÐÐʱ´´½¨»òʵÀý»¯µÄ¶ÔÏóÓë±äÁ¿£¬¶øÕ»ÄÚ´æÔòÊÇÓÃÀ´´æ´¢³ÌÐò´úÂëÖÐÉùÃ÷Ϊ¾²Ì¬£¨static£©»ò£¨·Ç¾²Ì¬£©µÄ·½·¨¡£
¶ÑÄڴ棨heap£©Í¨³£±»·Ö³ÉÁ½¸öÇøÓò£ºÐ¶ÔÏó£¨new object£©ÓëÀ϶ÔÏó£¨old object£©ÇøÓò¡£
жÔÏóÇøÓòÓÖ¿ÉÒÔϸ·ÖΪÈý¸öÐ¡ÇøÓò£ºÒÁµéÔ°£¨Eden£©ÇøÓò¡¢FromÇøÓòÓëToÇøÓò¡£ÒÁµéÔ°ÇøÓòÓÃÀ´±£´æÐ´´½¨µÄ¶ÔÏ󣬾ÍÏñ¶ÑÕ»Ò»Ñù£¬µ±ÇøÓòÖеĶÔÏóÂúÁËÖ®ºó£¬JVMϵͳ½«×ö¿É´ïÐÔ²âÊÔ£¬¼ì²âÄÄЩ¶ÔÏóÓɸù¼¯ºÏ³ö·¢ÊDz»¿É´ïµÄ£¬ÕâЩ¶ÔÏó¾Í¿É±»JVM»ØÊÕ£¬²¢ÇÒ½«Æä´ÓÒÁµéÔ°ÇøÓò¿½±´µ½ToÇøÓò£¬´ËʱһЩ¶ÔÏ󽫷¢Éú״̬½»»»£¬ÓеĶÔÏó¾Í´ÓToÇøÓò±»×ªÒƵ½FromÇøÓò£¬´ËʱFromÇøÓò¾ÍÓÐÁ˶ÔÏó¡£
ÔÚÀ϶ÔÏóÇøÓòÖеĶÔÏóÈÔÈ»»áÓÐÒ»¸ö½Ï³¤µÄÉúÃüÖÜÆÚ£¬µ«¾¹ýÒ»¶Îʱ¼äºó£¬ÕâЩ¶ÔÏó¾Í»á±ä³É¶ÌÃü¶ÔÏó£¬Ò²¾ÍÊÇÀ¬»ø¶ÔÏ󣬴Ӷø±»JVM»ØÊÕ£¬½¨Ò鲻ҪƵ·±µØÇ¿ÖÆÏµÍ³×öÀ¬»ø»ØÊÕ£¬ÕâÑù»áÓ°ÏìϵͳµÄÕûÌåÐÔÄÜ¡£
JVMÖжÔÏóµÄÉúÃüÖÜÆÚ´óÖ¿ɷÖΪ7¸ö½×¶Î£º´´½¨½×¶Î£¨Creation£©¡¢Ó¦Óý׶Σ¨Using£©¡¢²»¿ÉÊӽ׶Σ¨Invisible£©¡¢²»¿Éµ½´ï½×¶Î£¨Unreachable£©¡¢¿ÉÊÕ¼¯½×¶Î£¨Collected£©¡¢ÖÕ½á½×¶Î£¨Finalized£©¡¢ÊͷŽ׶Σ¨Free£©¡£
¡ù ´´½¨½×¶Î
ϵͳͨ¹ýÏÂÃæµÄ²½Ö裬Íê³É´´½¨¶ÔÏóµÄ¹ý³Ì£º
£¨1£© Ϊ¶ÔÏó·ÖÅä´æ´¢¿Õ¼ä¡£
£¨2£© ¿ªÊ¼¹¹Ôì¶ÔÏó¡£
£¨3£© µÝ¹éµ÷ÓÃÆä³¬ÀàµÄ¹¹Ôì·½·¨¡£
£¨4£© ½øÐжÔÏóʵÀý³õʼ»¯Óë±äÁ¿³õʼ»¯¡£
£¨5£© Ö´Ðй¹Ôì·½·¨Ìå¡£
´´½¨¶ÔÏóʱ¼¸¸ö¹Ø¼üÓ¦ÓùæÔò£º
£¨1£© ±ÜÃâÔÚÑ»·ÌåÖд´½¨¶ÔÏ󣬼´Ê¹¶ÔÏóÕ¼ÓõÄÄÚ´æ¿Õ¼ä²»´ó¡£
£¨2£© ¾¡Á¿¼°Ê±Ê¹¶ÔÏó·ûºÏÀ¬»ø»ØÊÕ±ê×¼¡£
£¨3£© ²»Òª²ÉÓùýÉîµÄ¼Ì³Ð²ã´Î¡£
£¨4£© ·ÃÎʱ¾µØ±äÁ¿ÓÅÓÚ·ÃÎÊÀàÖеıäÁ¿¡£
¡ù Ó¦Óý׶Î
ÔÚÓ¦Óý׶Σ¬¶ÔÏó¾ß±¸ÏÂÁÐÌØÕ÷£º
£¨1£© ϵͳÖÁÉÙά»¤¶ÔÏóµÄÒ»¸öÇ¿ÒýÓã¨Strong Reference£©£»
£¨2£© ËùÓжԸöÔÏóµÄÒýÓÃÈ«²¿ÊÇÇ¿ÒýÓ㬳ý·ÇÎÒÃÇÏÔʾʹÓÃÁËÈíÒýÓã¨Soft Reference£©¡¢ÈõÒýÓã¨Weak Reference£©»òÐéÒýÓã¨Phantom Reference£©¡£
Ç¿ÒýÓÃÊÇÖ¸JVMÄÚ´æ¹ÜÀíÆ÷´Ó¸ùÒýÓü¯ºÏ£¨Root set£©³ö·¢±éѰ¶ÑÖÐËùÓе½´ï¶ÔÏóµÄ·¾¶¡£µ±µ½´ï¶ÔÏóµÄÈÎÒâ·¾¶¶¼²»º¬ÓÐÒýÓöÔÏóʱ£¬Õâ¸ö¶ÔÏóµÄÒýÓþͱ»³ÆÎªÇ¿ÒýÓá£
ÈíÒýÓþßÓнÏÇ¿µÄÒýÓù¦ÄÜ£¬Ö»Óе±ÄÚ´æ²»¹»µÄʱºò£¬²Å»ØÊÕÕâÀàÄÚ´æ¡£ÁíÍâÕâЩÒýÓöÔÏó»¹Äܱ£Ö¤ÔÚJavaÅ׳öOutOfMemoryÒ쳣֮ǰ£¬±»ÉèÖÃΪNULL¡£Ëü¿ÉÒÔÓÃÓÚʵÏÖһЩ³£ÓÃ×ÊÔ´µÄ»º´æ£¬ÊµÏÖCacheµÄ¹¦ÄÜ£¬±£Ö¤×î´óÏ޶ȵÄÊÔÓÃÄÚ´æ¶ø²»ÒýÆðOutOfMemory¡£µ«ÔÚijЩʱºò¶ÔÈíÒýÓõÄÊÔÓûήµÍÓ¦ÓóÌÐòµÄÔËÐÐЧÂÊÓëÐÔÄÜ¡£
ÈõÒýÓöÔÏóÓëSoftÒýÓöÔÏóµÄ×î´ó²»Í¬¾ÍÔÚÓÚ£ºGCÔÚ½øÐлØÊÕʱ£¬ÐèҪͨ¹ýËã·¨¼ì²éÊÇ·ñ»ØÊÕSoftÒýÓöÔÏ󣬶ø¶ÔÓÚWeakÒýÓöÔÏó£¬GC×ÜÊǽøÐлØÊÕ¡£WeakÒýÓöÔÏó³£ÓÃÓÚMap½á¹¹ÖУ¬ÒýÓÃÕ¼ÓÃÄÚ´æ¿Õ¼ä±È½Ï´óµÄ¶ÔÏó£¬Ò»µ©¶ÔÏóµÄÇ¿ÒýÓÃΪnullʱ£¬Õâ¸ö¶ÔÏóµÄÒýÓþͲ»´æÔÚÁË£¬GCÄܹ»¿ìËÙ»ØÊոöÔÏó¡£
ÐéÒýÓõÄÓÃ;½ÏÉÙ£¬Ö÷ÒªÓÃÓÚ¸¨Öúfinalizeº¯ÊýµÄʹÓá£
¡ù ²»¿ÉÊÓ½×¶Î
µ±Ò»¸ö¶ÔÏó´¦ÔÚ²»¿ÉÊӽ׶Σ¬ËµÃ÷ÎÒÃDz»ÄÜÔÚÆäËüÇøÓòµÄ´úÂëÖÐÒýÓÃËü£¬´ËʱӦ¸ÃÖ÷¶¯½«ÆäÉèÖÃΪ¿Õ£¬°ïÖúJVM¼°Ê±µØ·¢ÏÖÕâ¸öÀ¬»ø¶ÔÏ󣬲¢ÇÒ»ØÊÕϵͳ×ÊÔ´¡£
¡ù ¿ÉÊÕ¼¯½×¶Î¡¢ÖÕ½á½×¶ÎÓëÊͷŽ׶Î
¶ÔÏó¿ÉÄÜ´¦ÓÚÈýÖÖÇé¿ö£º
£¨1£© »ØÊÕÆ÷·¢ÏָöÔÏóÒѾ²»¿Éµ½´ï¡£
£¨2£© Finalize·½·¨ÒѾ±»Ö´ÐС£
£¨3£© ¶ÔÏó¿Õ¼äÒѱ»ÖØÓá£
Java³ÌÐòÉè¼ÆÖÐÓйØÄÚ´æ¹ÜÀíµÄÆäËü¾Ñ飺
£¨1£© ×î»ù±¾µÄ½¨Òé¾ÍÊǾ¡ÔçÊÍ·ÅÎÞÓöÔÏóµÄÒýÓá£
£¨2£© ¾¡Á¿ÉÙÓÃfinalizeº¯Êý¡£
£¨3£© Èç¹ûÐèҪʹÓþ³£ÓôóµÄͼƬ£¬¿ÉÒÔʹÓÃsoftÓ¦ÓÃÀàÐÍ¡£
£¨4£© ×¢Ò⼯ºÏÊý¾ÝÀàÐÍ£¬°üÀ¨Êý×é¡¢Ê÷¡¢Í¼¡¢Á´±íµÈÊý¾Ý½á¹¹£¬ÕâЩÊý¾Ý½á¹¹¶ÔGCÀ´Ëµ£¬»ØÊÕ¸üΪ¸´ÔÓ¡£ÁíÍâ×¢ÒâһЩȫ¾Ö±äÁ¿£¬¾²Ì¬±äÁ¿£¬ÕâЩ±äÁ¿ÍùÍùÈÝÒ×Ôì³É²»±ØÒªµÄÄÚ´æ×ÊÔ´ÀË·Ñ¡£
£¨5£© ¾¡Á¿±ÜÃâÔÚÀàµÄĬÈϹ¹ÔìÆ÷Öд´½¨¡¢³õʼ»¯´óÁ¿¶ÔÏ󣬷ÀÖ¹ÔÚµ÷ÓÃÆä×ÔÀàµÄ¹¹ÔìÆ÷ʱÔì³É²»±ØÒªµÄÄÚ´æÀË·Ñ¡£
£¨6£© ¾¡Á¿±ÜÃâÇ¿ÖÆÏµÍ³×öÀ¬»ø»ØÊÕ£¬Ôö³¤ÏµÍ³×öÀ¬»ø»ØÊÕµÄ×îÖÕʱ¼ä£¬½µµÍϵͳÐÔÄÜ¡£
£¨7£© ¾¡Á¿±ÜÃâÏÔʾÉêÇëÊý×é¿Õ¼ä£¬µ±²»µÃ²»ÏÔʾµØÉêÇëÊý×é¿Õ¼äʱ¾¡Á¿×¼È·µÄ¹À¼Æ³öÆäºÏÀíÖµ¡£
£¨8£© ¾¡Á¿ÔÚÔ¶³Ì·½·¨µ÷Óã¨RMI£©ÀàÓ¦Óÿª·¢Ê±Ê¹ÓÃ˲¼äÖµ£¨transient£©±äÁ¿£¬³ý·ÇÔ¶³Ìµ÷ÓöËÐèÒª»ñÈ¡¸Ã˲¼äÖµ±äÁ¿µÄÖµ¡£
£¨9£© ¾¡Á¿ÔÚºÏÊʵij¡¾°ÏÂʹÓöÔÏ󳨼¼ÊõÒÔÌá¸ßϵͳÐÔÄÜ£¬Ëõ¼õϵͳ¿ªÏú£¬µ«ÊÇҪעÒâ¶ÔÏó³ØµÄ³ß´ç²»Ò˹ý´ó£¬¼°Ê±Çå³ýÎÞЧ¶ÔÏóÊÍ·ÅÄÚ´æ×ÊÔ´£¬×ۺϿ¼ÂÇÓ¦ÓÃÔËÐл·¾³µÄÄÚ´æ×ÊÔ´ÏÞÖÆ£¬±ÜÃâ¹ý¸ß¹À¼ÆÔËÐл·¾³ËùÌṩÄÚ´æ×ÊÔ´µÄÊýÁ¿¡£


