Java³ÌÐòÔ±ÔÚ±àÂë¹ý³ÌÖÐͨ³£²»ÐèÒª¿¼ÂÇÄÚ´æÎÊÌ⣬JVM¾¹ý¸ß¶ÈÓÅ»¯µÄGC»úÖÆ´ó²¿·ÖÇé¿ö϶¼Äܹ»ºÜºÃµØ´¦Àí¶Ñ(Heap)µÄÇåÀíÎÊÌâ¡£ÒÔÖÁÓÚÐí¶àJava³ÌÐòÔ±ÈÏΪ£¬ÎÒÖ»ÐèÒª¹ØÐĺÎʱ´´½¨¶ÔÏ󣬶ø»ØÊÕ¶ÔÏ󣬾ͽ»¸øGCÀ´×ö°É£¡ÉõÖÁÓÐÈË˵£¬Èç¹ûÔÚ±à³Ì¹ý³ÌÖÐÆµ·±¿¼ÂÇÄÚ´æÎÊÌ⣬ÊÇÒ»ÖÖÍË»¯£¬ÕâЩÊÂÇéÓ¦¸Ã½»¸ø±àÒëÆ÷£¬½»¸øÐéÄâ»úÀ´½â¾ö¡£
Õâ»°ÆäʵҲûÓÐÌ«´óÎÊÌ⣬µÄÈ·£¬´ó²¿·Ö³¡¾°Ï¹ØÐÄÄÚ´æ¡¢GCµÄÎÊÌ⣬ÏÔµÃÓе㡰è½ÈËÓÇÌ족ÁË£¬¸ßÀÏү˵¹ý£º
¹ýÔçÓÅ»¯ÊÇÍò¶ñÖ®Ô´¡£
µ«ÁíÒ»·½Ã棬ʲô²ÅÊÇ¡°¹ýÔçÓÅ»¯¡±£¿
If we could do things right for the
first time, why not?
ÊÂʵÉÏJVMµÄÄÚ´æÄ£ÐÍ( JMM )ÀíÓ¦ÊÇJava³ÌÐòÔ±µÄ»ù´¡ÖªÊ¶£¬´¦Àí¹ý¼¸´ÎJVMÏßÉÏÄÚ´æÎÊÌâÖ®ºó¾Í»áºÜÃ÷ÏÔ¸ÐÊܵ½£¬ºÜ¶àϵͳÎÊÌ⣬¶¼ÊÇÄÚ´æÎÊÌâ¡£
¶ÔJVMÄÚ´æ½á¹¹¸ÐÐËȤµÄͬѧ¿ÉÒÔ¿´Ï dzÎöJavaÐéÄâ»ú½á¹¹Óë»úÖÆ ÕâÆªÎÄÕ£¬±¾ÎľͲ»ÔÙ׸ÊöÁË£¬±¾ÎÄÒ²²¢²»¹Ø×¢¾ßÌåµÄGCËã·¨£¬Ïà¹ØµÄÎÄÕº¹Å£³ä¶°£¬ËæÊ±¿É²é¡£
ÁíÍ⣬²»ÒªÖ¸ÍûGCÓÅ»¯µÄÕâЩ¼¼ÇÉ£¬¿ÉÒÔ¶ÔÓ¦ÓÃÐÔÄÜÓгɱ¶µÄÌá¸ß£¬ÌرðÊǶÔI/OÃܼ¯Ð͵ÄÓ¦Ó㬻òÊÇʵ¼ÊÂäÔÚYoungGCÉϵÄÓÅ»¯£¬¿ÉÄÜЧ¹ûÖ»ÊǰïÄã¼õÉÙÄÇôһµãYoungGCµÄƵÂÊ¡£
µ«ÎÒÈÏΪ£¬ÓÅÐã³ÌÐòÔ±µÄ¼ÛÖµ£¬²»ÔÚÓÚÆäËùÕÆÎյļ¸ÕÐÍÀÁúÖ®Êõ£¬¶øÊÇÔÚϸ½ÚÖмûÕæÖø£¬¾ÍÏñÇ°ÃæËµµÄ£¬Èç¹ûÎÒÃÇ¿ÉÒÔÒ»´Î°ÑÊÂÇé×ö¶Ô£¬²¢ÇÒ×öºÃ£¬ÔÚÔÊÐíµÄ·¶Î§ÄÚ¾¡¿ÉÄÜ×·Çó׿Խ£¬ÎªÊ²Ã´²»È¥×öÄØ£¿
Ò»¡¢GC·Ö´úµÄ»ù±¾¼ÙÉè
´ó²¿·ÖGCËã·¨£¬¶¼½«¶ÑÄÚ´æ×ö·Ö´ú(Generation)´¦Àí£¬µ«ÊÇΪʲôҪ·Ö´úÄØ£¬ÓÖΪʲô²»½ÐÄÚ´æ·ÖÇø¡¢·Ö¶Î£¬¶øÒªÓÃÃæÏòʱ¼ä¡¢ÄêÁäµÄ¡°´ú¡±À´±íʾ²»Í¬µÄÄÚ´æÇøÓò£¿
GC·Ö´úµÄ»ù±¾¼ÙÉèÊÇ£º
¾ø´ó²¿·Ö¶ÔÏóµÄÉúÃüÖÜÆÚ¶¼·Ç³£¶ÌÔÝ£¬´æ»îʱ¼ä¶Ì¡£
¶øÕâЩ¶ÌÃüµÄ¶ÔÏó£¬Ç¡Ç¡ÊÇGCËã·¨ÐèÒªÊ×ÏȹØ×¢µÄ¡£ËùÒÔÔڴ󲿷ֵÄGCÖУ¬YoungGC£¨Ò²³Æ×÷MinorGC£©Õ¼Á˾ø´ó²¿·Ö£¬¶ÔÓÚ¸ºÔز»¸ßµÄÓ¦Ó㬿ÉÄÜÅÜÁËÊý¸öÔ¶¼²»»á·¢ÉúFullGC¡£
»ùÓÚÕâ¸öǰÌᣬÔÚ±àÂë¹ý³ÌÖУ¬ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵØËõ¶Ì¶ÔÏóµÄÉúÃüÖÜÆÚ¡£ÔÚ¹ýÈ¥£¬·ÖÅä¶ÔÏóÊÇÒ»¸ö±È½ÏÖØµÄ²Ù×÷£¬ËùÒÔÓÐЩ³ÌÐòÔ±»á¾¡¿ÉÄܵؼõÉÙnew¶ÔÏóµÄ´ÎÊý£¬³¢ÊÔ¼õС¶ÑµÄ·ÖÅ俪Ïú£¬¼õÉÙÄÚ´æË鯬¡£
µ«ÊÇ£¬¶ÌÃü¶ÔÏóµÄ´´½¨ÔÚJVMÖбÈÎÒÃÇÏëÏóµÄÐÔÄܸüºÃ£¬ËùÒÔ£¬²»ÒªÁߨÄnew¹Ø¼ü×Ö£¬´óµ¨µØÈ¥new°É¡£
µ±È»Ç°ÌáÊDz»×öÎÞνµÄ´´½¨£¬¶ÔÏó´´½¨µÄËÙÂÊÔ½¸ß£¬ÄÇôGCÒ²»áÔ½¿ì±»´¥·¢¡£
½áÂÛ£º
1.·ÖÅäС¶ÔÏóµÄ¿ªÏú·ÖÏíС£¬²»ÒªÁߨÄÈ¥´´½¨¡£
2.GC×îϲ»¶ÕâÖÖС¶ø¶ÌÃüµÄ¶ÔÏó¡£
3.ÈöÔÏóµÄÉúÃüÖÜÆÚ¾¡¿ÉẠ̈ܶ¬ÀýÈçÔÚ·½·¨ÌåÄÚ´´½¨£¬Ê¹ÆäÄܾ¡¿ìµØÔÚYoungGCÖб»»ØÊÕ£¬²»»á½úÉý(romote)µ½ÄêÀÏ´ú(Old
Generation)¡£
¶þ¡¢¶ÔÏó·ÖÅäµÄÓÅ»¯
»ùÓڴ󲿷ֶÔÏó¶¼ÊÇС¶ø¶ÌÃü£¬²¢ÇÒ²»´æÔÚ¶àÏ̵߳ÄÊý¾Ý¾ºÕù¡£ÕâЩС¶ÔÏóµÄ·ÖÅ䣬»áÓÅÏÈÔÚÏß³Ì˽ÓеÄ
TLAB ÖзÖÅ䣬TLABÖд´½¨µÄ¶ÔÏ󣬲»´æÔÚËøÉõÖÁÊÇCASµÄ¿ªÏú¡£
TLABÕ¼ÓõĿռäÔÚEden Generation¡£
µ±¶ÔÏó±È½Ï´ó£¬TLABµÄ¿Õ¼ä²»×ãÒÔ·ÅÏ£¬¶øJVMÓÖÈÏΪµ±Ç°Ïß³ÌÕ¼ÓõÄTLABÊ£Óà¿Õ¼ä»¹×㹻ʱ£¬¾Í»áÖ±½ÓÔÚEden
GenerationÉÏ·ÖÅ䣬´ËʱÊÇ´æÔÚ²¢·¢¾ºÕùµÄ£¬ËùÒÔ»áÓÐCASµÄ¿ªÏú£¬µ«Ò²»¹ºÃ¡£
µ±¶ÔÏó´óµ½Eden Generation·Å²»ÏÂʱ£¬JVMÖ»Äܳ¢ÊÔÈ¥Old
Generation·ÖÅ䣬ÕâÖÖÇé¿öÐèÒª¾¡¿ÉÄܱÜÃ⣬ÒòΪһµ©ÔÚOld Generation·ÖÅ䣬Õâ¸ö¶ÔÏó¾ÍÖ»Äܱ»Old
GenerationµÄGC»òÊÇFullGC»ØÊÕÁË¡£
Èý¡¢²»¿É±ä¶ÔÏóµÄºÃ´¦
GCËã·¨ÔÚɨÃè´æ»î¶ÔÏóʱͨ³£ÐèÒª´ÓROOT½Úµã¿ªÊ¼£¬É¨ÃèËùÓдæ»î¶ÔÏóµÄÒýÓ㬹¹½¨³ö¶ÔÏóͼ¡£
²»¿É±ä¶ÔÏó¶ÔGCµÄÓÅ»¯£¬Ö÷ÒªÌåÏÖÔÚOld GenerationÖС£
¿ÉÒÔÏëÏóһϣ¬Èç¹û´æÔÚOld GenerationµÄ¶ÔÏóÒýÓÃÁËYoung
GenerationµÄ¶ÔÏó£¬ÄÇôÔÚÿ´ÎYoungGCµÄ¹ý³ÌÖУ¬¾Í±ØÐ뿼Âǵ½ÕâÖÖÇé¿ö¡£
Hotspot JVMΪÁËÌá¸ßYoungGCµÄÐÔÄÜ£¬±ÜÃâÿ´ÎYoungGC¶¼É¨ÃèOld
GenerationÖеĶÔÏóÒýÓ㬲ÉÓÃÁË ¿¨±í(Card Table) µÄ·½Ê½¡£
¼òµ¥À´Ëµ£¬µ±Old GenerationÖеĶÔÏó·¢Éú¶ÔYoung GenerationÖеĶÔÏó²úÉúеÄÒýÓùØÏµ»òÊÍ·ÅÒýÓÃʱ£¬¶¼»áÔÚ¿¨±íÖÐÏìÓ¦µÄ±ê¼ÇÉϱê¼ÇΪÔà(dirty)£¬¶øYoungGCʱ£¬Ö»ÐèҪɨÃèÕâЩdirtyµÄÏî¾Í¿ÉÒÔÁË¡£
¿É±ä¶ÔÏó¶ÔÆäËü¶ÔÏóµÄÒýÓùØÏµ¿ÉÄÜ»áÆµ·±±ä»¯£¬²¢ÇÒÓпÉÄÜÔÚÔËÐйý³ÌÖгÖÓÐÔ½À´Ô½¶àµÄÒýÓã¬ÌرðÊÇÈÝÆ÷¡£ÕâЩ¶¼»áµ¼Ö¶ÔÓ¦µÄ¿¨±íÏƵ·±±ê¼ÇΪdirty¡£
¶ø²»¿É±ä¶ÔÏóµÄÒýÓùØÏµ·Ç³£Îȶ¨£¬ÔÚɨÃ迨±íʱ¾Í²»»áɨµ½ËüÃǶÔÓ¦µÄÏîÁË¡£
×¢Ò⣬ÕâÀïµÄ²»¿É±ä¶ÔÏ󣬲»ÊÇÖ¸½ö½ö×ÔÉíÒýÓò»¿É±äµÄfinal¶ÔÏ󣬶øÊÇÕæÕýµÄImmutable
Objects¡£
ËÄ¡¢ÒýÓÃÖÃΪnullµÄ´«Ëµ
ÔçÆÚµÄºÜ¶àJava×ÊÁÏÖж¼»áÌáµ½ÔÚ·½·¨ÌåÖн«Ò»¸ö±äÁ¿ÖÃΪnullÄܹ»ÓÅ»¯GCµÄÐÔÄÜ£¬ÀàËÆÏÂÃæµÄ´úÂ룺
List<String> list = new ArrayList<String>(); // some code list = null; // help GC |
ÊÂʵÉÏÕâÖÖ×ö·¨¶ÔGCµÄ°ïÖú΢ºõÆä΢£¬ÓÐʱºò·´¶ø»áµ¼Ö´úÂë»ìÂÒ¡£
ÎҼǵü¸Äêǰ @rednaxelafx ÔÚHLL VMС×éÖÐÏêϸÂÛÊö¹ýÕâ¸öÎÊÌ⣬ÔÌûÎÒûÕÒµ½£¬½áÂÛ»ù±¾¾ÍÊÇ£º
1.ÔÚÒ»¸ö·Ç³£´óµÄ·½·¨ÌåÄÚ£¬¶ÔÒ»¸ö½Ï´óµÄ¶ÔÏ󣬽«ÆäÒýÓÃÖÃΪnull£¬Ä³Ö̶ֳÈÉÏ¿ÉÒÔ°ïÖúGC¡£
2.´ó²¿·ÖÇé¿öÏ£¬ÕâÖÖÐÐΪ¶¼Ã»ÓÐÈκκô¦¡£
ËùÒÔ£¬»¹ÊÇÔçµã·ÅÆúÕâÖÖ¡°ÓÅ»¯¡±·½Ê½°É¡£
GC±ÈÎÒÃÇÏëÏóµÄ¸ü´ÏÃ÷¡£
Îå¡¢ÊÖ¶¯µµµÄGC
ÔںܶàJava×ÊÁÏÉ϶¼ÓÐÏÂÃæÁ½¸öÆæ¼¼ÒùÇÉ£º
1.ͨ¹ýThread.yield()ÈóöCPU×ÊÔ´¸øÆäËüÏ̡߳£
2.ͨ¹ýSystem.gc()´¥·¢GC¡£
ÊÂʵÉÏJVM´Ó²»±£Ö¤ÕâÁ½¼þÊ£¬¶øSystem.gc()ÔÚJVMÆô¶¯²ÎÊýÖÐÈç¹ûÔÊÐíÏÔʽGC£¬Ôò»á´¥·¢FullGC£¬¶ÔÓÚÏìÓ¦Ãô¸ÐµÄÓ¦ÓÃÀ´Ëµ£¬¼¸ºõµÈͬÓÚ×Ôɱ¡£
So£¬ÈÃÎÒÃÇÀμÇÁ½µã£º
1.Never use Thread.yield()¡£
2.Never use System.gc()¡£³ý·ÇÄãÕæµÄÐèÒª»ØÊÕNative
Memory¡£
µÚ¶þµãÓиöNative MemoryµÄÀýÍ⣬Èç¹ûÄãÔÚÒÔϳ¡¾°£º
1.ʹÓÃÁËNIO»òÕßNIO¿ò¼Ü£¨Mina/Netty£©
2.ʹÓÃÁËDirectByteBuffer·ÖÅä×Ö½Ú»º³åÇø
3.ʹÓÃÁËMappedByteBuffer×öÄÚ´æÓ³Éä
ÓÉÓÚNative MemoryÖ»ÄÜͨ¹ýFullGC£¨»òÊÇCMS GC£©»ØÊÕ£¬ËùÒÔ³ý·ÇÄã·Ç³£Çå³þÕâÊ±ÕæµÄÓбØÒª£¬·ñÔò²»ÒªÇáÒ×µ÷ÓÃSystem.gc()£¬ÇÒÐÐÇÒÕäϧ¡£
ÁíÍâΪÁË·ÀֹijЩ¿ò¼ÜÖеÄSystem.gcµ÷Óã¨ÀýÈçNIO¿ò¼Ü¡¢Java
RMI£©£¬½¨ÒéÔÚÆô¶¯²ÎÊýÖмÓÉÏ-XX:+DisableExplicitGCÀ´½ûÓÃÏÔʽGC¡£
Õâ¸ö²ÎÊýÓиö¾Þ´óµÄ¿Ó£¬Èç¹ûÄã½ûÓÃÁËSystem.gc()£¬ÄÇôÉÏÃæµÄ3ÖÖ³¡¾°ÏµÄÄÚ´æ¾ÍÎÞ·¨»ØÊÕ£¬¿ÉÄÜÔì³ÉOOM£¬Èç¹ûÄãʹÓÃÁËCMS
GC£¬ÄÇô¿ÉÒÔÓÃÕâ¸ö²ÎÊýÌæ´ú£º-XX:+ExplicitGCInvokesConcurrent¡£
¹ØÓÚSystem.gc()£¬¿ÉÒԲο¼ @bluedavy µÄ¼¸ÆªÎÄÕ£º
1.CMS GC»á²»»á»ØÊÕDirect ByteBufferµÄÄÚ´æ
2.˵˵ÔÚJavaÆô¶¯²ÎÊýÉÏÎÒ·¸µÄ´í
3.java.lang.OutOfMemoryError:Map failed
Áù¡¢Ö¸¶¨ÈÝÆ÷³õʼ»¯´óС
JavaÈÝÆ÷µÄÒ»¸öÌØµã¾ÍÊÇ¿ÉÒÔ¶¯Ì¬À©Õ¹£¬ËùÒÔͨ³£ÎÒÃǶ¼²»»áÈ¥¿¼Âdzõʼ´óСµÄÉèÖ㬲»¹»ÁË·´Õý»á×Ô¶¯À©ÈÝß¡£
µ«ÊÇÀ©Èݲ»Òâζ×ÅûÓдú¼Û£¬ÉõÖÁÊǺܸߵĴú¼Û¡£
ÀýÈçһЩ»ùÓÚÊý×éµÄÊý¾Ý½á¹¹£¬ÀýÈçStringBuilder¡¢StringBuffer¡¢ArrayList¡¢HashMapµÈµÈ£¬ÔÚÀ©ÈݵÄʱºò¶¼ÐèÒª×öArrayCopy£¬¶ÔÓÚ²»¶ÏÔö³¤µÄ½á¹¹À´Ëµ£¬¾¹ýÈô¸É´ÎÀ©ÈÝ£¬»á´æÔÚ´óÁ¿ÎÞÓõÄÀÏÊý×飬¶ø»ØÊÕÕâЩÊý×éµÄѹÁ¦£¬È«¶¼»á¼ÓÔÚGCÉíÉÏ¡£
ÕâЩÈÝÆ÷µÄ¹¹Ô캯ÊýÖÐͨ³£¶¼ÓÐÒ»¸ö¿ÉÒÔÖ¸¶¨´óСµÄ²ÎÊý£¬Èç¹û¶ÔÓÚijЩ´óС¿ÉÒÔÔ¤¹ÀµÄÈÝÆ÷£¬½¨Òé¼ÓÉÏÕâ¸ö²ÎÊý¡£
¿ÉÊÇÒòΪÈÝÆ÷µÄÀ©Èݲ¢²»Êǵȵ½ÈÝÆ÷ÂúÁ˲ÅÀ©ÈÝ£¬¶øÊÇÓÐÒ»¶¨µÄ±ÈÀý£¬ÀýÈçHashMapµÄÀ©ÈÝãÐÖµºÍ¸ºÔØÒò×Ó(loadFactor)Ïà¹Ø¡£
Google Guava¿ò¼Ü¶ÔÓÚÈÝÆ÷µÄ³õʼÈÝÁ¿ÌṩÁ˷dz£±ã½ÝµÄ¹¤¾ß·½·¨£¬ÀýÈ磺
Lists.newArrayListWithCapacity(initialArraySize); Lists.newArrayListWithExpectedSize(estimatedSize); Sets.newHashSetWithExpectedSize(expectedSize); Maps.newHashMapWithExpectedSize(expectedSize); |
ÕâÑùÎÒÃÇÖ»Òª´«ÈëÔ¤¹ÀµÄ´óС¼´¿É£¬ÈÝÁ¿µÄ¼ÆËã¾Í½»¸øGuavaÀ´×ö°É¡£
·´Àý£ºÈç¹û²ÉÓÃĬÈÏÎ޲ι¹Ô캯Êý£¬´´½¨Ò»¸öArrayList£¬²»¶ÏÔö¼ÓÔªËØÖ±µ½OOM£¬ÄÇôÔڴ˹ý³ÌÖлᵼÖ£º
1.¶à´ÎÊý×éÀ©ÈÝ£¬ÖØÐ·ÖÅä¸ü´ó¿Õ¼äµÄÊý×é
2.¶à´ÎÊý×鿽±´
3.ÄÚ´æË鯬
Æß¡¢¶ÔÏó³Ø
ΪÁ˼õÉÙ¶ÔÏó·ÖÅ俪Ïú£¬Ìá¸ßÐÔÄÜ£¬¿ÉÄÜÓÐÈË»á²ÉÈ¡¶ÔÏ󳨵ķ½Ê½À´»º´æ¶ÔÏ󼯺ϣ¬×÷Ϊ¸´ÓõÄÊֶΡ£
µ«ÊǶÔÏó³ØÖеĶÔÏóÓÉÓÚÔÚÔËÐÐÆÚ³¤ÆÚ´æ»î£¬´ó²¿·Ö»á½úÉýµ½Old Generation£¬Òò´ËÎÞ·¨Í¨¹ýYoungGC»ØÊÕ¡£
²¢ÇÒͨ³£¡¡Ã»ÓÐʲôЧ¹û¡£
¶ÔÓÚ¶ÔÏó±¾Éí£º
1.Èç¹û¶ÔÏóºÜС£¬ÄÇô·ÖÅäµÄ¿ªÏú±¾À´¾ÍС£¬¶ÔÏó³ØÖ»»áÔö¼Ó´úÂ븴ÔÓ¶È¡£
2.Èç¹û¶ÔÏó±È½Ï´ó£¬ÄÇô½úÉýµ½Old Generationºó£¬¶ÔGCµÄѹÁ¦¾Í¸ü´óÁË¡£
´ÓḬ̈߳²È«µÄ½Ç¶È¿¼ÂÇ£¬Í¨³£³Ø¶¼Êǻᱻ²¢·¢·ÃÎʵģ¬ÄÇôÄã¾ÍÐèÒª´¦ÀíºÃͬ²½µÄÎÊÌ⣬ÕâÓÖÊÇÒ»¸ö´ó¿Ó£¬²¢ÇÒͬ²½´øÀ´µÄ¿ªÏú£¬Î´±Ø±ÈÄãÖØÐ´´½¨Ò»¸ö¶ÔÏóС¡£
¶ÔÓÚ¶ÔÏ󳨣¬Î¨Ò»ºÏÊʵij¡¾°¾ÍÊǵ±³ØÖеÄÿ¸ö¶ÔÏóµÄ´´½¨¿ªÏúºÜ´óʱ£¬»º´æ¸´ÓòÅÓÐÒâÒ壬ÀýÈçÿ´Înew¶¼»á´´½¨Ò»¸öÁ¬½Ó£¬»òÊÇÒÀÀµÒ»´ÎRPC¡£
±ÈÈç˵£º
1.Ï̳߳Ø
2.Êý¾Ý¿âÁ¬½Ó³Ø
3.TCPÁ¬½Ó³Ø
¼´Ê¹ÄãÕæµÄÐèҪʵÏÖÒ»¸ö¶ÔÏ󳨣¬Ò²ÇëʹÓóÉÊìµÄ¿ªÔ´¿ò¼Ü£¬ÀýÈçApache
Commons Pool¡£
ÁíÍ⣬ʹÓÃJDKµÄThreadPoolExecutor×÷ΪÏ̳߳أ¬²»ÒªÖظ´ÔìÂÖ×Ó£¬³ý·Çµ±Äã¿´¹ýAQSµÄÔ´ÂëºóÈÏΪÄã¿ÉÒÔдµÃ±ÈDoug
Lea¸üºÃ¡£
°Ë¡¢¶ÔÏó×÷ÓÃÓò
¾¡¿ÉÄÜËõС¶ÔÏóµÄ×÷ÓÃÓò£¬¼´ÉúÃüÖÜÆÚ¡£
1.Èç¹û¿ÉÒÔÔÚ·½·¨ÄÚÉùÃ÷µÄ¾Ö²¿±äÁ¿£¬¾Í²»ÒªÉùÃ÷ΪʵÀý±äÁ¿¡£
2.³ý·ÇÄãµÄ¶ÔÏóÊǵ¥ÀýµÄ»ò²»±äµÄ£¬·ñÔò¾¡¿ÉÄÜÉÙµØÉùÃ÷static±äÁ¿¡£
¾Å¡¢¸÷ÀàÒýÓÃ
java.lang.ref.ReferenceÓм¸¸ö×ÓÀ࣬ÓÃÓÚ´¦ÀíºÍGCÏà¹ØµÄÒýÓá£JVMµÄÒýÓÃÀàÐͼòµ¥À´ËµÓм¸ÖÖ£º
1.Strong Reference£¬×î³£¼ûµÄÒýÓÃ
2.Weak Reference£¬µ±Ã»ÓÐÖ¸ÏòËüµÄÇ¿ÒýÓÃʱ»á±»GC»ØÊÕ
3.Soft Reference£¬Ö»µ±ÁÙ½üOOMʱ²Å»á±»GC»ØÊÕ
4.Phantom Reference£¬Ö÷ÒªÓÃÓÚʶ±ð¶ÔÏó±»GCµÄʱ»ú£¬Í¨³£ÓÃÓÚ×öһЩÇåÀí¹¤×÷
µ±ÄãÐèҪʵÏÖÒ»¸ö»º´æÊ±£¬¿ÉÒÔ¿¼ÂÇÓÅÏÈʹÓÃWeakHashMap£¬¶ø²»ÊÇHashMap£¬µ±È»£¬¸üºÃµÄÑ¡ÔñÊÇʹÓÿò¼Ü£¬ÀýÈçGuava
Cache¡£
×îºó£¬ÔÙ´ÎÌáÐÑ£¬ÒÔÉϵÄÕâЩδ±Ø¿ÉÒÔ¶Ô´úÂëÓжàÉÙÐÔÄÜÉϵÄÌáÉý£¬µ«ÊÇÊìϤÕâЩ·½·¨£¬ÊÇΪÁ˰ïÖúÎÒÃÇд³ö¸ü׿ԽµÄ´úÂ룬ºÍGC¸üºÃµØºÏ×÷¡£ |