ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

ʲôÊÇÈíÒýÓã¿ ÓÐʲô×÷ÓÃ
2014-11-24 01:34:59 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:9440´Î
Tags£ºÊ²Ã´ ÒýÓà ×÷ÓÃ

ÔÚ±¾ÎÄÖУ¬Ëû½«½âÊÍ Reference ¶ÔÏóµÄÁíÍâÒ»ÖÖÐÎʽ£¬¼´ÈíÒýÓã¨soft references£©£¬ÓÃÓÚ°ïÖúÀ¬»øÊÕ¼¯Æ÷¹ÜÀíÄÚ´æʹÓúÍÏû³ýDZÔÚµÄÄÚ´æй©¡£


¡¡¡¡À¬»øÊÕ¼¯¿ÉÒÔʹ Java ³ÌÐò²»»á³öÏÖÄÚ´æй©£¬ÖÁÉÙ¶ÔÓڱȽÏÏÁÕ­µÄ ¡°ÄÚ´æй©¡± ¶¨ÒåÀ´ËµÈç´Ë£¬µ«ÊÇÕâ²¢²»Òâζ×ÅÎÒÃÇ¿ÉÒÔÍêÈ«ºöÂÔ Java ³ÌÐòÖеĶÔÏóÉú´æÆÚ£¨lifetime£©ÎÊÌâ¡£µ±ÎÒÃÇûÓжԶÔÏóÉúÃüÖÜÆÚ£¨lifecycle£©ÒýÆð×ã¹»µÄÖØÊÓ»òÕßÆÆ»µÁ˹ÜÀí¶ÔÏóÉúÃüÖÜÆڵıê×¼»úÖÆʱ£¬Java ³ÌÐòÖÐͨ³£¾Í»á³öÏÖÄÚ´æй©¡£ÀýÈ磬ÉÏÒ»´Î ÎÒÃÇ¿´µ½ÁË£¬²»ÄÜ»®·Ö¶ÔÏóµÄÉúÃüÖÜÆڻᵼÖ£¬ÔÚÊÔͼ½«ÔªÊý¾Ý¹ØÁªµ½Ë²Ê±¶ÔÏóʱ³öÏÖÒâÍâµÄ¶ÔÏó±£³Ö¡£»¹ÓÐһЩÆäËûµÄÇé¿ö¿ÉÒÔÀàËƵغöÂÔ»òÆÆ»µ¶ÔÏóÉúÃüÖÜÆÚ¹ÜÀí£¬²¢µ¼ÖÂÄÚ´æй©¡£


¡¡¡¡¶ÔÏóÓÎÀë


¡¡¡¡Ò»ÖÖÐÎʽµÄÄÚ´æй©ÓÐʱºò½Ð×ö¶ÔÏóÓÎÀ루object loitering£©£¬ÊÇͨ¹ýÇåµ¥ 1 ÖÐµÄ LeakyChecksum ÀàÀ´ËµÃ÷µÄ£¬Çåµ¥ 1 ÖÐÓÐÒ»¸ö getFileChecksum() ·½·¨ÓÃÓÚ¼ÆËãÎļþÄÚÈݵÄУÑéºÍ¡£getFileChecksum() ·½·¨½«ÎļþÄÚÈݶÁÈ¡µ½»º³åÇøÖÐÒÔ¼ÆËãУÑéºÍ¡£Ò»ÖÖ¸ü¼ÓÖ±¹ÛµÄʵÏÖ¼òµ¥µØ½«»º³åÇø×÷Ϊ getFileChecksum() Öеı¾µØ±äÁ¿·ÖÅ䣬µ«ÊǸð汾±ÈÄÇÑùµÄ°æ±¾¸ü¼Ó ¡°´ÏÃ÷¡±£¬²»Êǽ«»º³åÇø»º´æÔÚʵÀý×Ö¶ÎÖÐÒÔ¼õÉÙÄÚ´æ churn¡£¸Ã ¡°ÓÅ»¯¡±Í¨³£²»´øÀ´Ô¤Æڵĺô¦£»¶ÔÏó·ÖÅä±ÈºÜ¶àÈËÆÚÍûµÄ¸ü±ãÒË¡££¨»¹Òª×¢Ò⣬½«»º³åÇø´Ó±¾µØ±äÁ¿ÌáÉýµ½ÊµÀý±äÁ¿£¬Ê¹µÃÀàÈô²»´øÓи½¼ÓµÄͬ²½£¬¾Í²»ÔÙÊÇḬ̈߳²È«µÄÁË¡£Ö±¹ÛµÄʵÏÖ²»ÐèÒª½« getFileChecksum() ÉùÃ÷Ϊ synchronized£¬²¢ÇÒ»áÔÚͬʱµ÷ÓÃʱÌṩ¸üºÃµÄ¿ÉÉìËõÐÔ¡££©


¡¡¡¡Çåµ¥ 1. չʾ ¡°¶ÔÏóÓÎÀ롱 µÄÀà


// BAD CODE ¨C DO NOT EMULATE
public class LeakyChecksum {
¡¡private byte[] byteArray;


¡¡public synchronized int getFileChecksum(String fileName) {
¡¡¡¡int len = getFileSize(fileName);
¡¡¡¡if (byteArray == null || byteArray.length < len)
¡¡¡¡¡¡byteArray = new byte[len];
¡¡¡¡readFileContents(fileName, byteArray);
¡¡¡¡// calculate checksum and return it
¡¡}
}
¡¡¡¡Õâ¸öÀà´æÔںܶàµÄÎÊÌ⣬µ«ÊÇÎÒÃÇ×ÅÖØÀ´¿´ÄÚ´æй©¡£»º´æ»º³åÇøµÄ¾ö¶¨ºÜ¿ÉÄÜÊǸù¾ÝÕâÑùµÄ¼ÙÉèµÃ³öµÄ£¬¼´¸ÃÀཫÔÚÒ»¸ö³ÌÐòÖб»µ÷ÓÃÐí¶à´Î£¬Òò´ËËüÓ¦¸Ã¸ü¼ÓÓÐЧ£¬ÒÔÖØÓûº³åÇø¶ø²»ÊÇÖØзÖÅäËü¡£µ«Êǽá¹ûÊÇ£¬»º³åÇøÓÀÔ¶²»»á±»ÊÍ·Å£¬ÒòΪËü¶Ô³ÌÐòÀ´Ëµ×ÜÊǿɼ°µÄ£¨³ý·Ç LeakyChecksum ¶ÔÏó±»À¬»øÊÕ¼¯ÁË£©¡£¸ü»µµÄÊÇ£¬Ëü¿ÉÒÔÔö³¤£¬È´²»¿ÉÒÔËõС£¬ËùÒÔ LeakyChecksum ½«ÓÀ¾Ã±£³ÖÒ»¸öÓëËù´¦ÀíµÄ×î´óÎļþÒ»Ñù´óСµÄ»º³åÇø¡£ÍËÒ»Íò²½Ëµ£¬ÕâÒ²»á¸øÀ¬»øÊÕ¼¯Æ÷´øÀ´Ñ¹Á¦£¬²¢ÇÒÒªÇó¸üƵ·±µÄÊÕ¼¯£»Îª¼ÆËãδÀ´µÄУÑéºÍ¶ø±£³ÖÒ»¸ö´óÐÍ»º³åÇø²¢²»ÊÇ¿ÉÓÃÄÚ´æµÄ×îÓÐЧÀûÓá£


¡¡¡¡LeakyChecksum ÖÐÎÊÌâµÄÔ­ÒòÊÇ£¬»º³åÇø¶ÔÓÚ getFileChecksum() ²Ù×÷À´ËµÂß¼­ÉÏÊDZ¾µØµÄ£¬µ«ÊÇËüµÄÉúÃüÖÜÆÚÒѾ­±»ÈËΪÑÓ³¤ÁË£¬ÒòΪ½«ËüÌáÉýµ½ÁËʵÀý×ֶΡ£Òò´Ë£¬¸ÃÀà±ØÐë×Ô¼º¹ÜÀí»º³åÇøµÄÉúÃüÖÜÆÚ£¬¶ø²»ÊÇÈà JVM À´¹ÜÀí¡£


¡¡¡¡ÈíÒýÓÃ


¡¡¡¡ÈõÒýÓÃÈçºÎ¿ÉÒÔ¸øÓ¦ÓóÌÐòÌṩµ±¶ÔÏó±»³ÌÐòʹÓÃʱÁíÒ»ÖÖµ½´ï¸Ã¶ÔÏóµÄ·½·¨£¬µ«ÊDz»»áÑÓ³¤¶ÔÏóµÄÉúÃüÖÜÆÚ¡£Reference µÄÁíÒ»¸ö×ÓÀà ¡ª¡ª ÈíÒýÓà ¡ª¡ª ¿ÉÂú×ãÒ»¸ö²»Í¬È´Ïà¹ØµÄÄ¿µÄ¡£ÆäÖÐÈõÒýÓÃÔÊÐíÓ¦ÓóÌÐò´´½¨²»·Á°­À¬»øÊÕ¼¯µÄÒýÓã¬ÈíÒýÓÃÔÊÐíÓ¦ÓóÌÐòͨ¹ý½«Ò»Ð©¶ÔÏóÖ¸¶¨Îª ¡°expendable¡± ¶øÀûÓÃÀ¬»øÊÕ¼¯Æ÷µÄ°ïÖú¡£¾¡¹ÜÀ¬»øÊÕ¼¯Æ÷ÔÚÕÒ³öÄÄЩÄÚ´æÔÚÓÉÓ¦ÓóÌÐòʹÓÃÄÄЩûÔÚʹÓ÷½Ãæ×öµÃºÜºÃ£¬µ«ÊÇÈ·¶¨¿ÉÓÃÄÚ´æµÄ×îÊʵ±Ê¹Óû¹ÊÇÈ¡¾öÓÚÓ¦ÓóÌÐò¡£Èç¹ûÓ¦ÓóÌÐò×ö³öÁ˲»ºÃµÄ¾ö¶¨£¬Ê¹µÃ¶ÔÏó±»±£³Ö£¬ÄÇôÐÔÄÜ»áÊܵ½Ó°Ï죬ÒòΪÀ¬»øÊÕ¼¯Æ÷±ØÐë¸ü¼ÓÐÁÇڵع¤×÷£¬ÒÔ·ÀÖ¹Ó¦ÓóÌÐòÏûºÄµôËùÓÐÄÚ´æ¡£


¡¡¡¡¸ßËÙ»º´æÊÇÒ»ÖÖ³£¼ûµÄÐÔÄÜÓÅ»¯£¬ÔÊÐíÓ¦ÓóÌÐòÖØÓÃÒÔÇ°µÄ¼ÆËã½á¹û£¬¶ø²»ÊÇÖØнøÐмÆËã¡£¸ßËÙ»º´æÊÇ CPU ÀûÓúÍÄÚ´æʹÓÃÖ®¼äµÄÒ»ÖÖÕÛÖÔ£¬ÕâÖÖÕÛÖÔÀíÏëµÄƽºâ״̬ȡ¾öÓÚÓжàÉÙÄÚ´æ¿ÉÓá£Èô¸ßËÙ»º´æÌ«ÉÙ£¬ÔòËùÒªÇóµÄÐÔÄÜÓÅÊÆÎÞ·¨´ïµ½£»ÈôÌ«¶à£¬ÔòÐÔÄÜ»áÊܵ½Ó°Ï죬ÒòΪ̫¶àµÄÄÚ´æ±»ÓÃÓÚ¸ßËÙ»º´æÉÏ£¬µ¼ÖÂÆäËûÓÃ;ûÓÐ×ã¹»µÄ¿ÉÓÃÄÚ´æ¡£ÒòΪÀ¬»øÊÕ¼¯Æ÷±ÈÓ¦ÓóÌÐò¸üÊʺϾö¶¨ÄÚ´æÐèÇó£¬ËùÒÔÓ¦¸ÃÀûÓÃÀ¬»øÊÕ¼¯Æ÷ÔÚ×öÕâЩ¾ö¶¨·½ÃæµÄ°ïÖú£¬Õâ¾ÍÊǼþÒýÓÃËùÒª×öµÄ¡£


¡¡¡¡Èç¹ûÒ»¸ö¶ÔÏóΩһʣϵÄÒýÓÃÊÇÈõÒýÓûòÈíÒýÓã¬ÄÇô¸Ã¶ÔÏóÊÇÈí¿É¼°µÄ£¨softly reachable£©¡£À¬»øÊÕ¼¯Æ÷²¢²»ÏñÆäÊÕ¼¯Èõ¿É¼°µÄ¶ÔÏóÒ»Ñù¾¡Á¿µØÊÕ¼¯Èí¿É¼°µÄ¶ÔÏó£¬Ïà·´£¬ËüÖ»ÔÚÕæÕý ¡°ÐèÒª¡± ÄÚ´æʱ²ÅÊÕ¼¯Èí¿É¼°µÄ¶ÔÏó¡£ÈíÒýÓöÔÓÚÀ¬»øÊÕ¼¯Æ÷À´ËµÊÇÕâÑùÒ»ÖÖ·½Ê½£¬¼´ ¡°Ö»ÒªÄڴ治̫½ôÕÅ£¬ÎҾͻᱣÁô¸Ã¶ÔÏó¡£µ«ÊÇÈç¹ûÄÚ´æ±äµÃÕæÕý½ôÕÅÁË£¬ÎҾͻáÈ¥ÊÕ¼¯²¢´¦ÀíÕâ¸ö¶ÔÏ󡣡± À¬»øÊÕ¼¯Æ÷ÔÚ¿ÉÒÔÅ׳ö OutOfMemoryError ֮ǰÐèÒªÇå³ýËùÓеÄÈíÒýÓá£


¡¡¡¡Í¨¹ýʹÓÃÒ»¸öÈíÒýÓÃÀ´¹ÜÀí¸ßËÙ»º´æµÄ»º³åÇø£¬¿ÉÒÔ½â¾ö LeakyChecksum ÖеÄÎÊÌ⣬ÈçÇåµ¥ 2 Ëùʾ¡£ÏÖÔÚ£¬Ö»Òª²»ÊÇÌرðÐèÒªÄڴ棬»º³åÇø¾Í»á±»±£Áô£¬µ«ÊÇÔÚÐèҪʱ£¬Ò²¿É±»À¬»øÊÕ¼¯Æ÷»ØÊÕ£º


¡¡¡¡Çåµ¥ 2. ÓÃÈíÒýÓÃÐÞ¸´ LeakyChecksum


public class CachingChecksum {
¡¡private SoftReferencebufferRef;


¡¡public synchronized int getFileChecksum(String fileName) {
¡¡¡¡int len = getFileSize(fileName);
¡¡¡¡byte[] byteArray = bufferRef.get();
¡¡¡¡if (byteArray == null || byteArray.length < len) {
¡¡¡¡¡¡byteArray = new byte[len];
¡¡¡¡¡¡bufferRef.set(byteArray);
¡¡¡¡}
¡¡¡¡readFileContents(fileName, byteArray);
¡¡¡¡// calculate checksum and return it
¡¡}
}


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºÈí¼þ¹«Ë¾³£Îʵļ¼ÊõÃæÊÔÌâ(.net s.. ÏÂһƪ£º.NET¿¼Ìâ

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿