×÷Ϊһ¸öÈý¸ö¶àÔÂûÓÐÈ¥¹¤×÷µÄ¶ÀÁ¢¿ª·¢Õß¶øÑÔ,½ñÌìȥСÃ×ÃæÊÔÁËÒ»°Ñ.ÔõÃ´ËµÄØ,ÎÞÂÛÄãˮƽÈçºÎ,ÇëÈ·±£ÔÚÃæÊÔ֮ǰҪ×ö×¼±¸,¾ÍÏñÆäÖÐÒ»Î»ÃæÊÔ¹Ù˵µÄÒ»Ñù,ÎÒÖªµÀÄãˮƽ²»´í,µ«ÊÇÎÞÂÛÈçºÎÒ²ÊÇҪ׼±¸ÏµÄ,²»È»ÄãÔõô»áÁ¬Õâ¸ö·½·¨Ò²Íü¼ÇÁË?
´Ë¿Ì,ÎÒͻȻ¾õµÃÎÒÊÇÒ»¸ö¼Ù³ÌÐòÔ±.ΪʲôÕâÃ´ËµÄØ,×÷Ϊһ¸ö´Ó12Äê¾Í¿ªÊ¼Ð´´úÂëµÄ³ÌÐòÔ±À´Ëµ,Íü¼Çij¸ö·½·¨Ì«¿É³ÜÁË.µÈ¸ÏÃ÷дһƪÎÄÕ¾ͽÐ×ö¡±ÎÒÊǸö¼Ù³ÌÐòÔ±¡±À´Ì¸Ì¸ÕâЩÓÐȤµÄʶù.
»°²»¶à˵,½ñÌìҪ̸µÄÖ÷ÌâÊÇÏà¶Ô½ÏÉî,½Ï¹ã,µ«ÎÒŬÁ¦µÄÈÃËû¿´ÆðÀ´ÇåÎúÃ÷ÁË.
´æ´¢Æ÷²ã´Î½á¹¹
¶ÔÓÚ¿ª·¢ÕßÀ´Ëµ,´æ´¢Æ÷µÄ²ã´Î½á¹¹Ó¦¸ÃÊǷdz£ÊìϤµÄ,´óÌåÈçÏÂ:

ÆäÖмĴæÆ÷,L1,L2,L3¶¼±»·â×°ÔÚCPUоƬÖÐ,×÷ΪӦÓÿª·¢Õß¶øÑÔÎÒÃǺÜÉÙÈ¥×¢ÒâºÍʹÓÃËü.Ö®ËùÒÔÒýÈëL1,L2,L3¸ßËټĴæÆ÷,Æä¸ù±¾ÊÇΪÁ˽â¾ö·ÃÎÊÔËËãÆ÷ºÍÄÚ´æËٶȲ»Æ¥Åä.µ«»º´æµÄÒýÈëÒ²´øÀ´Á½¸öÎÊÌâ:
»º´æÃüÖÐÂÊ:»º´æµÄÊý¾Ý¶¼ÊÇÖ÷´æÖÐÊý¾ÝµÄ±¸·Ý,Èç¹ûÖ¸ÁîËùÐèÒªµÄÊý¾ÝÇ¡ºÃÔÚ»º´æÖÐ,ÎÒÃǾÍ˵»º´æÃüÖÐ,·´Ö®,ÐèÒª´ÓÖ÷´æÖлñÈ¡.Ò»¸öºÃµÄ»º´æ²ßÂÔÓ¦¸Ã¾¡¿ÉÄܵÄÌá¸ßÃüÖÐÂÊ,ÈçºÎÌá¸ßÈ´ÊÇÒ»¼þ·Ç³£À§ÄѵÄÊÂÇé.
»º´æÒ»ÖÂÐÔÎÊÌâ:ÎÒÃÇÖªµÀ»º´æÊÇÖ÷´æÊý¾ÝµÄ±¸·Ý,µ«Ã¿¸öºËÐͼÓÐ×Ô¼ºµÄ»º´æ,µ±»º´æÖеÄÊý¾ÝºÍÄÚ´æÖеÄÊý¾Ý²»Ò»ÖÂʱ,Ó¦¸ÃÒÔ˵ÄÊý¾ÝÎª×¼ÄØ,Õâ¾ÍÊÇËùν»º´æÒ»ÖÂÐÔÎÊÌâ.
ÉÏÃæÖ»ÊÇչʾ´æ´¢Æ÷µÄ²ã´Î½á¹¹,ÏÖÔÚÎÒÃÇÀ´¸üÐÎÏóµÄÀ´¿´Ò»ÏÂCPUоƬÓëÄÚ´æÖ®¼äÁªÏµ,ÒÔIntel i5Ë«ºË´¦ÀíÆ÷ΪÀý:

ͨ¹ýÉÏͼÎÒÃÇÄÜÃ÷ÏԵĿ´³ö¸÷¸ö»º´æÖ®¼äµÄÁªÏµ,ÔÚËæºóµÄJVMÄÚ´æÄ£ÐÍÆÊÎöÖÐ,ÄãͬÑù»á·¢ÏÖÀàËÆµÄ½á¹¹.¹ØÓÚ´æ´¢Æ÷²ã´Î½á¹¹µ½ÕâÀïÒѾ×ã¹»,±Ï¾¹ÎÒÃDz»ÊÇרÃÅ×ö²Ù×÷ϵͳµÄ,ÏÂÃæÎÒÃÇÀ´ÁÄÁÄÖ÷´æ,¸üÈ·ÇеÄ˵³éÏóµÄÐéÄâÄÚ´æ.
ÐéÄâÄÚ´æ
̸ÆðÄÚ´æµÄʱºò,ÿ¸öÈ˵ÄÄÔº£Öж¼»á³ÊÏÖ³öÄÚ´æÌõµÄÐÎÏó,Ôںܶàʱºò,ÕâÖÖʵÎï¸øÎÒÃǶÔÄÚ´æ×îÖ±¹ÛµÄÀí½â,¶ÔÓÚ·Ç¿ª·¢ÕßÕâôÀí½âÊÇ¿ÉÒÔ½ÓÊܵÄ,µ«ÊǶÔÓÚ´ÓÊ¿ª·¢¿ª·¢¹¤×÷µÄ¹¤³Ìʦ¶øÑÔ,ÎÒÃÇ»¹Òª¼ÓÉîÒ»µã.

´ÓÓ²¼þµÄ½Ç¶ÈÀ´¿´,ÄÚ´æ¾ÍÊÇÒ»¿éÓй̶¨ÈÝÁ¿µÄ´æ´¢Ìå,Óë¸ÃÓ²¼þÖ±½Ó´ò½»µÀµÄÊÇÎÒÃǵIJÙ×÷ϵͳ.ÎÒÃÇÖªµÀϵͳµÄ½ø³Ì¶¼Êǹ²ÏíCPUºÍÄÚ´æ×ÊÔ´µÄ,ÏÖ´ú²Ù×÷ϵͳΪÁ˸üÓÐЧµÄ¹ÜÀíÄÚ´æ,Ìá³öÁËÄÚ´æµÄ³éÏó¸ÅÄî,³ÆÖ®ÎªÐéÄâÄÚ´æ.»»ÑÔÖ®,ÎÒÃÇÔÚ²Ù×÷ϵͳÖÐËùÌáµ½µÄÄÚ´æ¹ÜÀí̸µÄ¶¼ÊÇÐéÄâÄÚ´æ.ÐéÄâÄÚ´æµÄÌá³ö´øÀ´¼¸¸öºÃ´¦:
ÐéÄâÄڴ潫Ö÷´æ¿´³ÉÊÇÒ»¸ö´æ´¢ÔÚ´ÅÅÌÉϵĵØÖ·¿Õ¼äµÄ¸æËß»º´æ.Ó¦ÓÃÔÚδÔËÐÐ֮ǰ,Ö»ÊÇ´æ´¢ÔÚ´ÅÅÌÉ϶þ½øÖÆÎļþ,ÔËÐкó,¸ÃÓ¦Óòű»¸´ÖƵ½Ö÷´æÖÐ.
ËüΪÿ¸ö½ø³ÌÌṩÁËÒ»ÖµĵØÖ·¿Õ¼ä,¼ò»¯ÁËÄÚ´æ¹ÜÀí»úÖÆ.¼òµ¥µãÀ´¿´¾ÍÊÇÿ¸ö½ø³Ì¶¼ÈÏΪ×Ô¼º¶ÀÕ¼¸ÃÖ÷´æ.×î¼òµ¥µÄÀý×Ó¾ÍÊÇÒ»¶°Â¥±»·Ö³ÉÐí¶à¸ö·¿¼ä,ÿ¸ö·¿¼ä¶¼ÊǶÀÁ¢,ÊÇ»§Ö÷רÓÐ,ÿ¸ö»§Ö÷¶¼¿ÉÒÔ´ÓÁ㿪ʼ×ÔÖú×°ÐÞ.ÁíÍâ,ÔÚδÕ÷µÃÆäËû»§Ö÷µÄͬÒâ֮ǰ,ÄãÊÇÎÞ·¨½øÈëÆäËû·¿¼äµÄ.
ÐéÄâÄÚ´æµÄÌá³öÒ²¸Ä±äÁËÄÚ´æ·ÃÎʵķ½Ê½.֮ǰCPU·ÃÎÊÖ÷´æµÄ·½Ê½ÈçÏÂ:

ÉÏͼÑÝʾÁËCPUÖ±½Óͨ¹ýÎïÀíµØÖ·(¼ÙÉèÊÇ2)À´·ÃÎÊÖ÷´æµÄ¹ý³Ì,µ«Èç¹ûÓÐÁËÐéÄâÄÚ´æÖ®ºó,Õû¸ö·ÃÎʹý³ÌÈçÏÂ:

CPU¸ø¶¨Ò»¸öÐéÄâµØÖ·,È»ºó¾¹ýMMU(ÄÚ´æ¹ÜÀíµ¥Ôª,Ó²¼þ)½«ÐéÄâµØÖ··Òë³ÉÕæÕýµÄÎïÀíµØÖ·,ÔÙ·ÃÎÊÖ÷´æ.±ÈÈçÏÖÔÚÐéÄâµØÖ·ÊÇ4200¾¹ýMMUµÄ·ÒëÖ±½Ó±ä³ÉÕæÕýµÄÎïÀíµØÖ·2.
ÕâÀïÀ´½âÊÍÏÂʲôÊÇÐéÄâÄÚ´æµØÖ·.ÎÒÃÇÖªµÀÐéÄâÄÚ´æÎªÃ¿¸ö½ø³ÌÌṩÁËÒ»¸ö¼ÙÏó:ÿ¸ö½ø³Ì¶¼ÔÚ¶ÀÕ¼µØÊ¹ÓÃÖ÷´æ,ÿ¸ö½ø³Ì¿´µ½µÄÄÚ´æ¶¼ÊÇÒ»ÑùµÄ,Õâ³ÆÖ®ÎªÐéÄâµØÖ·¿Õ¼ä.¾Ù¸öÀý×ÓÀ´Ëµ,±ÈÈçÎÒÃÇÄÚ´æÌõÊÇ1GµÄ,¼´×î´óµØÖ·¿Õ¼ä210,Õâʱij¸ö½ø³ÌÐèÒª4GµÄÄÚ´æ,ÄÇô²Ù×÷ϵͳ¿ÉÒÔ½«ÆäÓ³Éä³É¸ü´óµÄµØÖ·¿Õ¼ä232,Õâ¸öµØÖ·¿Õ¼ä¾ÍÊÇËùνµÄÐéÄâÄÚ´æµØÖ·.¹ØÓÚÈçºÎÓ³Éä,ÓÐÐËȤµÄ¿ÉÒÔ×ÔÐÐѧϰ.ÓÃÒ»ÕÅͼÀ´³éÏóµÄ±íʾ:

µ½ÏÖÔÚÎÒÃÇÃ÷°×ÔÀ´ÔÀ´ÎÒÃÇËù̸²Ù×÷ϵͳÖÐ̸µÄÄÚ´æÆäʵÊÇÐéÄâÄÚ´æ,Èç¹ûÄãÊÇCÓïÑÔ¿ª·¢Õß,ÄǶԴ˵ĸÐÊÜ¿ÉÄܸüÉî.¼ÈȻÿ¸ö½ø³Ì¶¼ÓµÓÐ×Ô¼ºµÄÐéÄâµØÖ·¿Õ¼ä,ÄÇôËüµÄ²¼¾ÖÊÇÈçºÎµÄÄØ?ÒÔLinuxϵͳΪÀý,À´¿´Ò»ÏÂËüµÄ½ø³Ì¿Õ¼äµØÖ·µÄ²¼¾Ö:

µ½ÏÖÔÚΪֹ,ÎÒÃÇÖÕÓÚ×ßµ½Á˽ø³ÌÕâÒ»²½.ÎÒÃÇÖªµÀ,ÿ¸öJVM¶¼ÔËÐÐÔÚÒ»¸öµ¥¶ÀµÄ½ø³Ìµ±ÖÐ,ºÍÆÕͨӦÓò»Í¬,JVMÏ൱ÓÚÒ»¸ö²Ù×÷ϵͳ,ËüÓÐ×Å×Ô¼ºµÄÄÚ´æÄ£ÐÍ.ÏÂÃæ,¾ÍÇÐÈëµ½JVMµÄÄÚ´æÄ£ÐÍÖÐ.
²¢·¢Ä£ÐÍ(Ïß³Ì)
Èç¹ûJavaûÓжàÏ̵߳ÄÖ§³Ö,ûÓÐJITµÄ´æÔÚ,ÄÇôҲ²»»áÓÐÏÖÔÚJVMÄÚ´æÄ£ÐÍ.ΪʲôÕâÃ´ËµÄØ?Ê×ÏÈÎÒÃÇ´ÓJIT˵Æð,JIT»á×·×Ù³ÌÐòµÄÔËÐйý³Ì,²¢¶ÔÆäÖпÉÄܵĵط½½øÐÐÓÅ»¯,ÆäÖÐÓÐÒ»ÏîÓÅ»¯ºÍ´¦ÀíÆ÷µÄÂÒÐòÖ´ÐÐÀàËÆ,²»¹ýÕâÀï½Ð×öÖ¸ÁîÖØÅÅ.Èç¹ûûÓжàÏß³Ì,Ò²¾Í²»»á´æÔÚËùνµÄÁÙ½ç×ÊÔ´,Èç¹ûÕâ¸öǰÖÃÌõ¼þ²»´æÔÚµ±È»Ò²¾Í²»»á´æÔÚ×ÊÔ´¾ºÕùÕâһ˵·¨ÁË.ÕâÑùÒ»À´,¿ÉÄÜJavaÔçÒѾ±»ÅׯúÔÚÀúÊ·µÄ³¤ºÓÖÐ.
¾¡¹ÜJavaÓïÑÔ²»ÏñCÓïÑÔÄܹ»Ö±½Ó²Ù×÷ÄÚ´æ,µ«ÊÇÕÆÎÕJVMÄÚ´æÄ£ÐÍÈÔÈ»·Ç³£ÖØÒª.¶ÔÓÚÎªÊ²Ã´ÒªÕÆÎÕJVMÄÚ´æÄ£Ð͵ÃÏÈ´ÓJavaµÄ²¢·¢±à³ÌÄ£ÐÍ˵Æð.
ÔÚ²¢·¢Ä£ÐÍÖÐÐèÒª´¦ÀíÁ½¸ö¹Ø¼üÎÊÌâ:Ïß³ÌÖ®¼äÈçºÎͨÐÅÒÔ¼°Ïß³ÌÖ®¼äÈçºÎͬ²½.ËùνµÄͨÐÅÖ¸µÄÊÇÏß³ÌÖ®¼äÈçºÎ½»»»ÏûÏ¢,¶øÍ¬²½ÔòÓÃÓÚ¿ØÖƲ»Í¬Ïß³ÌÖ®¼ä²Ù×÷·¢ÉúµÄÏà¶Ô˳Ðò.
´ÓʵÏֵĽǶÈÀ´Ëµ,²¢·¢Ä£ÐÍÒ»°ãÓÐÁ½ÖÖ·½Ê½:»ùÓÚ¹²ÏíÄÚ´æºÍ»ùÓÚÏûÏ¢´«µÝ.Á½ÕßʵÏֵIJ»Í¬¾ö¶¨ÁËͨÐźÍͬ²½µÄÐÐΪµÄ²îÒì.ÔÚ»ùÓÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍÖÐ,ͬ²½ÊÇÏÔʾµÄ,ͨÐÅÊÇÒþʽµÄ;¶øÔÚ»ùÓÚÏûÏ¢´«µÝµÄ²¢·¢Ä£ÐÍÖÐ,ͨÐÅÊÇÏÔʽµÄ,ͬ²½ÊÇÒþʽµÄ.ÎÒÃÇÀ´¾ßÌå½âÊÍÒ»ÏÂ.
ÔÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍÖÐ,ÈκÎÏ̶߳¼¿ÉÒÔ¹«¹²ÄÚ´æ½øÐвÙ×÷,Èç¹û²»¼ÓÒÔÏÔʾͬ²½,ÄÇôִÐÐ˳Ðò½«ÊDz»¿ÉÖªµÄ,ҲǡÊÇÒòΪÄĸöÏ̶߳¼¿ÉÒÔ¶Ô¹«¹²ÄÚ´æ²Ù×÷,ËùÒÔͨÐÅÊÇÒþʽµÄ.¶øÔÚ»ùÓÚÏûÏ¢´«µÝµÄ²¢·¢Ä£ÐÍÖÐ,ÓÉÓÚÏûÏ¢µÄ·¢ËÍÒ»¶¨ÊÇÔÚ½ÓÊÜ֮ǰ,Òò´Ëͬ²½ÊÇÒþʽµÄ,µ«ÊÇÏß³ÌÖ®¼ä±ØÐëͨ¹ýÃ÷È·µÄ·¢ËÍÏûÏ¢À´½øÐÐͨÐÅ.
ÔÚ×îÖÕ²¢·¢Ä£ÐÍÑ¡Ôñ·½°¸ÉÏ,javaÑ¡Ôñ»ùÓÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍ,Ò²¾ÍÊÇÏÔʽͬ²½,ÒþʽͨÐÅ.Èç¹ûÔÚ±àд³ÌÐòʱ,²»´¦ÀíºÃÕâÁ½¸öÎÊÌâ,ÄÇÔÚ¶àÏ̻߳á³öÏÖ¸÷ÖÖÆæ¹ÖµÄÎÊÌâ.Òò´Ë,¶ÔÈκÎJava³ÌÐòÔ±À´Ëµ,ÊìϤJVMµÄÄÚ´æÄ£ÐÍÊǷdz£ÖØÒªµÄ.
JVMÄÚ´æ½á¹¹
¶ÔÓÚJVMÄÚ´æ,Ö÷Òª°üº¬Á½·½Ãæ:JVMÄÚ´æ½á¹¹ºÍJVMÄÚ´æÄ£ÐÍ.Á½ÕßÖ®¼äµÄÇø±ðÔÚÓÚÄ£ÐÍÊÇÒ»ÖÖÐÒé,¹æ¶¨¶ÔÌØ¶¨ÄÚ´æ»ò»º´æµÄ¶Áд¹ý³Ì,ǧÍò²»ÒªÅª»ìÁË.
ºÜ¶àÈËÍùÍù¶ÔJVMÄÚ´æ½á¹¹ºÍ½ø³ÌµÄÄÚ´æ½á¹¹¸Ðµ½À§»ó,ÕâÀïÎÒ½«°ïÖúÄãÊáÀíÒ»ÏÂ.
JVM±¾ÖÊÉÏÒ²ÊÇÒ»¸ö³ÌÐò,Ö»²»¹ýËüÓÖÓÐ×ÅÀàËÆ²Ù×÷ϵͳµÄÌØÐÔ.µ±Ò»¸öJVMʵÀý¿ªÊ¼ÔËÐÐʱ,´ËʱÔÚLinux½ø³ÌÖÐ,ÆäÄÚ´æ²¼¾ÖÈçÏÂ:

JVMÔÚ½ø³Ì¶Ñ¿Õ¼äµÄ»ù´¡ÉÏÔٴνøÐл®·Ö,À´¼òµ¥¿´Ò»ÏÂ.´ËʱµÄÓÀÉú´ú±¾ÖÊÉϾÍÊÇJava³ÌÐò³ÌÐòµÄ´úÂëÇøºÍÊý¾ÝÇø,¶øÄêÇá´úºÍÀÏÄê´ú²ÅÊÇJava³ÌÐòÕæÕýʹÓõĶÑÇø,Ò²¾ÍÊÇÎÒÃǾ³£¹ÒÔÚ×ì±ßµÄ.µ«ÊÇ´ËʱµÄ¶ÑÇøºÍ½ø³ÌÉϵĶÑÈ´ÓֺܴóµÄÇø±ð:ÔÚµ÷ÓÃC³ÌÐòµÄmallocº¯Êýʱ,»áÒýÆðÒ»´Îϵͳ¼¶µÄµ÷ÓÃ;ÔÚʹÓÃfreeº¯ÊýÊÍ·ÅÄÚ´æÊ±,ͬÑùÒ²»áÒýÆðÒ»´Îϵͳ¼¶µÄµ÷ÓÃ,µ«ÊÇJVMÖжÑÇø²¢·ÇÈç´Ë:JVMÒ»´ÎÐÔÏòϵͳÉêÇëÒ»¿éÁ¬ÐøµÄÄÚ´æÇøÓò,×÷ΪJava³ÌÐòµÄ¶Ñ,µ±Java³ÌÐòʹÓÃnewÉêÇëÄÚ´æÊ±,JVM»á¸ù¾ÝÐèÒªÔÚÕâ¶ÎÄÚ´æÇøÓòÖÐΪÆä·ÖÅä,¶ø²»ÐèÒª³ý·ÇÒ»´Îϵͳ¼¶±ðµÄµ÷ÓÃ.¿ÉÒÔ¿´³öJVMÆäʵ×ÔÐÐʵÏÖÁËÒ»Ìõ¶ÑÄÚ´æµÄ¹ÜÀí»úÖÆ,ÕâÖÖ¹ÜÀí·½Ê½ÓÐÒÔϺô¦:
¼õÉÙϵͳ¼¶±ðµÄµ÷ÓÃ.´ó²¿·ÖÄÚ´æÉêÇëºÍ»ØÊײ»ÐèÒª´¥·¢ÏµÍ³º¯Êý,½ö½öÖ»ÔÚJava¶Ñ´óС·¢Éú±ä»¯Ê±²Å»áÒýÆðϵͳº¯ÊýµÄµ÷ÓÃ.Ïà±Èϵͳ¼¶±ðµÄµ÷ÓÃ,JVMʵÏÖÄÚ´æ¹ÜÀí³É±¾¸üµÍ.
¼õÉÙÄÚ´æÐ¹Â©Çé¿öµÄ·¢Éú.ͨ¹ýJVM½Ó¹ÜÄÚ´æ¹ÜÀí¹ý³Ì,¿ÉÒÔ±ÜÃâ´ó¶àÇé¿öϵÄÄÚ´æÐ¹Â©ÎÊÌâ.
ÏÖÔÚÒѾ¼òµ¥½éÉÜÁËJVMÄÚ´æ½á¹¹,Ï£ÍûÕâÑùÄܰïÖúÄã´òͨÉÏÏÂ.µ±È»,ΪÁ˺ÃÀí½â,ÎÒÊ¡ÂÔÁËÆäÖÐһЩÏà¶Ô²»ÖØÒªµÄµã,ÈçÓÐÐËȤ¿ÉÒÔ×ÔÐÐѧϰ.½²ÍêÁËJVMÄÚ´æ½á¹¹,ÏÂÒ»²½¸ÃÊÇÊ²Ã´ÄØ?
JVMÄÚ´æÄ£ÐÍ
Java²ÉÓõÄÊÇ»ùÓÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍ,ʹµÃJVM¿´ÆðÀ´·Ç³£ÀàËÆÏÖ´ú¶àºË´¦ÀíÆ÷:ÔÚ»ùÓÚ¹²ÏíÄÚ´æµÄ¶àºË´¦ÀíÆ÷Ìåϵ¼Ü¹¹ÖÐ,ÿ¸ö´¦ÀíÆ÷¶¼ÓÐ×Ô¼ºµÄ»º´æ,²¢ÇÒ¶¨ÆÚÓëÖ÷ÄÚ´æ½øÐÐе÷.ÕâÀïµÄÏß³ÌͬÑùÓÐ×Ô¼ºµÄ»º´æ(Ò²½Ð¹¤×÷ÄÚ´æ),´Ëʱ,JVMÄÚ´æÄ£ÐͳÊÏÖ³öÈçϽṹ:

ÉÏͼչʾJVMµÄÄÚ´æÄ£ÐÍ,Ò²³ÆÖ®ÎªJMM.¶ÔÓÚJMMÓÐÒÔϹ涨:
1. ËùÓеıäÁ¿¶¼´æ´¢ÔÚÖ÷ÄÚ´æ(Main Memory)
2. ÿ¸öÏß³ÌÒ²ÓÐÓÃ×Ô¼ºµÄ¹¤×÷ÄÚ´æ(Work Memory)
3. ¹¤×÷ÄÚ´æÖеıäÁ¿ÊÇÖ÷ÄÚ´æ±äÁ¿µÄ¿½±´,Ï̲߳»ÄÜÖ±½Ó¶ÁдÖ÷ÄÚ´æµÄ±äÁ¿,¶øÖ»ÄܲÙ×÷×Ô¼º¹¤×÷ÄÚ´æÖеıäÁ¿
4. Ï̼߳䲻¹²Ïí¹¤×÷ÄÚ´æ,Èç¹ûÏ̼߳äÐèҪͨÐűØÐë½èÖúÖ÷ÄÚ´æÀ´Íê³É
¹²Ïí±äÁ¿ËùÔÚµÄÄÚ´æÇøÓòÒ²¾ÍÊǹ²ÏíÄÚ´æ,Ò²³ÆÖ®Îª¶ÑÄÚ´æ,¸ÃÇøÓòÖеıäÁ¿¶¼¿ÉÄܱ»¹²Ïí,¼´±»¶àÏ̷߳ÃÎÊ.˵µÄÔÙͨË×µã¾ÍÊÇÔÚjavaµ±ÖÐ,¶ÑÄÚ´æÊÇÔÚÏ̼߳乲ÏíµÄ,¶ø¾Ö²¿±äÁ¿,ÐβκÍÒì³£³ÌÐò²ÎÊý²»ÔÚ¶ÑÄÚ´æ,Òò´Ë¾Í²»´æÔÚ¶àÏ̹߳²ÏíµÄÇé¿ö.
ÓëJMM¹æ¶¨Ïà¶ÔÓ¦,ÎÒÃǶ¨ÒåÁËÒÔÏÂËĸöÔ×ÓÐÔ²Ù×÷À´ÊµÏÖ±äÁ¿´ÓÖ÷Äڴ濽±´µ½¹¤×÷ÄÚ´æµÄ¹ý³Ì:
read:¶ÁÈ¡Ö÷ÄÚ´æµÄ±äÁ¿,²¢½«Æä´«Ë͵½¹¤×÷ÄÚ´æ
load:°Ñread²Ù×÷´ÓÖ÷ÄÚ´æµÃµ½µÄ±äÁ¿Öµ·ÅÈëµ½¹¤×÷ÄÚ´æµÄ¿½±´ÖÐ
store:°Ñ¹¤×÷ÄÚ´æÖеÄÒ»¸ö±äÁ¿Öµ´«Ë͵½Ö÷ÄÚ´æµ±ÖÐ,ÒÔ±ãÓÃÓÚºóÃæµÄwrite²Ù×÷
write:°Ñstore²Ù×÷´Ó¹¤×÷ÄÚ´æÖеõ½µÄ±äÁ¿µÄÖµ·ÅÈëÖ÷ÄÚ´æµÄ±äÁ¿ÖÐ.
¿ÉÒÔ¿´³ö,´ÓÖ÷ÄÚ´æµ½¹¤×÷ÄÚ´æµÄ¹ý³ÌÆäʵÊÇÒª¾¹ýreadºÍloadÁ½¸ö²Ù×÷µÄ,·´Ö®ÐèÒª¾¹ýstoreºÍwriteÁ½¸ö²Ù×÷.
ÏÖÔÚÎÒÃÇÀ´¿´Ò»¶Î´úÂë,²¢ÓýáºÏÉÏÎÄ̸̸϶àḬ̈߳²È«ÎÊÌâ:
public class ThreadTest {
public static void main(String[] args) throws
InterruptedException {
ShareVar ins = new ShareVar();
List<Thread> threadList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Thread thread;
if (i % 2 == 0) {
thread = new Thread(new AddThread(ins));
} else {
thread = new Thread(new SubThread(ins));
}
thread.start();
threadList.add(thread);
}
for (Thread thread : threadList) {
thread.join();
}
System.out.println(Thread.currentThread().getId()
+ " " + ins.getCount());
}
}
class ShareVar {
private int count;
public void add() {
try {
Thread.sleep(100);//´Ë´¦ÎªÁ˸üºÃµÄÌåÏÖ¶àḬ̈߳²È«ÎÊÌâ
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
public void sub() {
count--;
}
public int getCount() {
return count;
}
}
class AddThread implements Runnable {
private ShareVar shareVar;
public AddThread(ShareVar shareVar) {
this.shareVar = shareVar;
}
@Override
public void run() {
shareVar.add();
}
}
class SubThread implements Runnable {
private ShareVar shareVar;
public SubThread(ShareVar shareVar) {
this.shareVar = shareVar;
}
@Override
public void run() {
shareVar.sub();
}
} |
ÀíÏëÇé¿öÏÂ,×îºóÓ¦¸ÃÊä³ö0,µ«ÊǶà´ÎÔËÐÐÄã»áÏÈ¿ÉÄÜÊä³ö-1»òÕß-2µÈ.ÎªÊ²Ã´ÄØ?
ÔÚ´´½¨µÄÕâ10¸öÏß³ÌÖÐ,ÿ¸öÏ̶߳¼ÓÐ×Ô¼º¹¤×÷ÄÚ´æ,¶øÕâЩÏß³ÌÓÖ¹²ÏíÁËShareVar¶ÔÏóµÄcount±äÁ¿,µ±Ïß³ÌÆô¶¯Ê±,»á¾¹ýread-load²Ù×÷´ÓÖ÷ÄÚ´æÖп½±´¸Ã±äÁ¿ÖÁ×Ô¼ºµÄ¹¤×÷ÄÚ´æÖÐ,Ëæºóÿ¸öÏ̻߳áÔÚ×Ô¼ºµÄ¹¤×÷ÄÚ´æÖвÙ×÷¸Ã±äÁ¿¸±±¾,×îºó»á½«¸Ã¸±±¾ÖØÐÂд»áµ½Ö÷ÄÚ´æ,Ìæ»»ÔÏȱäÁ¿µÄÖµ.µ«ÔÚ¶à¸öÏß³ÌÖÐ,µ«ÓÉÓÚÏ̼߳äÎÞ·¨Ö±½ÓͨÐÅ,Õâ¾Íµ¼Ö±äÁ¿µÄ±ä»¯²»Äܼ°Ê±µÄ·´Ó¦ÔÚÏ̵߳±ÖÐ,ÕâÖÖϸ΢µÄʱ¼ä²î×îÖÕµ¼ÖÂÿ¸öÏ̵߳±Ç°²Ù×÷µÄ±äÁ¿ÖµÎ´±ØÊÇ×îеÄ,Õâ¾ÍÊÇËùνµÄÄÚ´æ²»¿É¼ûÐÔ.
ÏÖÔÚÎÒÏëÄãÒѾÍêÈ«Ã÷°×Á˶àḬ̈߳²È«ÎÊÌâµÄÓÉÀ´.ÄǸÃÔõô½â¾öÄØ?×î¼òµ¥µÄ·½·¨¾ÍÊÇÈöà¸öÏ̶߳Թ²Ïí¶ÔÏóµÄ¶Áд²Ù×÷±à³Ì´®ÐÐ,Ò²¾ÍÊÇͬһʱ¿ÌÖ»ÔÊÐíÒ»¸öÏ̶߳Թ²Ïí¶ÔÏó½øÐвÙ×÷.ÎÒÃǽ«ÕâÖÖ»úÖÆ³ÉÎªËø»úÖÆ,javaÖй涨ÿ¸ö¶ÔÏó¶¼ÓÐÒ»°ÑËø,³ÆÖ®Îª¼àÊÓÆ÷(monitor),ÓÐÈËÒ²½Ð×÷¶ÔÏóËø,ͬһʱ¿Ì,¸Ã¶ÔÏóËøÖ»ÄÜ·þÎñÒ»¸öÏß³Ì.
ÓÐÁËËø¶ÔÏóÖ®ºó,ËüÊÇÔõôÉúЧµÄÄØ?Ϊ´ËJMMÖÐÓÖ¶¨ÒåÁËÁ½¸öÔ×Ó²Ù×÷:
lock:½«Ö÷ÄÚ´æµÄ±äÁ¿±êʶΪһÌõÏ̶߳Àռ״̬
unlock:½â³ýÖ÷ÄÚ´æÖбäÁ¿µÄÏ̶߳Àռ״̬
ÔÚËø¶ÔÏóºÍÕâÁ½¸öÔ×Ó²Ù×÷¹²Í¬×÷ÓÃ϶ø³ÉµÄËø»úÖÆ¾Í¿ÉÒÔʵÏÖͬ²½ÁË,ÌåÏÖÔÚÓïÑÔ²ãÃæ¾ÍÊÇsynchronized¹Ø¼ü×Ö.ÉÏÃæÎÒÃÇҲ˵µÀJava²ÉÓõÄÊÇ»ùÓÚ¹²ÏíÄÚ´æµÄ²¢·¢Ä£ÐÍ,¸ÃÄ£Ð͵äÐ͵ÄÌØÕ÷ÊÇÒªÏÔʽͬ²½,Ò²¾ÍÊÇ˵ÔÚÒªÈËΪµÄʹÓÃsynchronized¹Ø¼ü×ÖÀ´×öͬ²½.ÏÖÔÚÎÒÃÇÀ´¸Ä½øÉÏÃæµÄ´úÂë,Ö»ÐèҪΪadd()ºÍsub()·½·¨Ìí¼Ósyhcronized¹Ø¼ü×Ö¼´¿É,µ«ÔÚÕâ֮ǰ,ÏÈÀ´¿´¿´ÕâÁ½¸ö·½·¨¶ÔÓ¦µÄ×Ö½ÚÂëÎļþ:
public void add();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=2, args_size=1
0: ldc2_w #2 // long 100l
3: invokestatic #4 // Method java/lang/Thread.sleep:(J)V
6: goto 14
9: astore_1
10: aload_1
11: invokevirtual #6 // Method java/lang/InterruptedException.printStackTrace:()V
14: aload_0
15: dup
16: getfield #7 // Field count:I
19: iconst_1
20: iadd
21: putfield #7 // Field count:I
24: return
public void sub();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: dup
2: getfield #7 // Field count:I
5: iconst_1
6: isub
7: putfield #7 // Field count:I
10: return
LineNumberTable:
line 18: 0
line 19: 10 |
ÏÖÔÚÎÒÃÇʹÓÃsynchronizedÀ´ÈÃ×ÅÁ½¸ö·½·¨±äµÃ°²È«ÆðÀ´:
class ShareVar {
private int count;
public synchronized void add() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
public synchronized void sub() {
count--;
}
public int getCount() {
return count;
}
} |
´ËʱÕâ¶Î´úÂëÔÚ¶àÏß³ÌÖоͻá±íÏÖÁ¼ºÃ.ÔÙÀ´¿´¿´ËüµÄ×Ö½ÚÂëÎļþ·¢ÉúÁËʲô±ä»¯:
public synchronized void add();
descriptor: ()V
flags: ACC_PUBLIC, ACC_SYNCHRONIZED
Code:
stack=3, locals=2, args_size=1
0: ldc2_w #2 // long 100l
3: invokestatic #4 // Method java/lang/Thread.sleep:(J)V
6: goto 14
9: astore_1
10: aload_1
11: invokevirtual #6 // Method java/lang/InterruptedException.printStackTrace:()V
14: aload_0
15: dup
16: getfield #7 // Field count:I
19: iconst_1
20: iadd
21: putfield #7 // Field count:I
24: return
public synchronized void sub();
descriptor: ()V
flags: ACC_PUBLIC, ACC_SYNCHRONIZED
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: dup
2: getfield #7 // Field count:I
5: iconst_1
6: isub
7: putfield #7 // Field count:I
10: return
LineNumberTable:
line 18: 0
line 19: 10 |
ͨ¹ý×Ö½ÚÂë²»ÄÑ¿´³ö×î´óµÄ±ä»¯ÔÚÓÚ·½·¨µÄflagsÖÐÔö¼ÓÁËACC_SYNCHRONIZED±êʶ,ÐéÄâ»úÔÚÓöµ½¸Ã±êʶʱ,»áÒþʽµÄΪ·½·¨Ìí¼ÓmonitorenterºÍmonitorexitÖ¸Áî,ÕâÁ½¸öÖ¸Áî¾ÍÊÇÔÚJMMµÄlockºÍunlock²Ù×÷ÉÏʵÏÖµÄ.
ÆäÖÐmonitorenterÖ¸Áî»á»ñÈ¡¶ÔÏóµÄÕ¼ÓÐȨ,´ËʱÓÐÒÔÏÂÈýÖÖ¿ÉÄÜ:
Èç¹û¸Ã¶ÔÏóµÄmonitorµÄÖµ0,Ôò¸ÃÏ߳̽øÈë¸Ãmonitor,²¢½«ÆäÖµ±êΪ1,±íÃ÷¶ÔÏ󱻸ÃÏ̶߳ÀÕ¼.
ͬһ¸öÏß³Ì,Èç¹û֮ǰÒѾռÓиöÔÏóÁË,µ±ÔٴνøÈëʱ,Ð轫¸Ã¶ÔÏóµÄmonitorµÄÖµ¼Ó1.
Èç¹û¸Ã¶ÔÏóµÄmonitorÖµ²»Îª0,±íÃ÷¸Ã¶ÔÏ󱻯äËûÏ̶߳ÀÕ¼ÁË,´Ëʱ¸ÃÏ߳̽øÈë×èÈû״̬,µÈµ½¸Ã¶ÔÏóµÄmonitorµÄֵΪ0ʱ,ÔÚ³¢ÊÔ»ñÈ¡¸Ã¶ÔÏó.
¶ømonitorexitµÄÖ¸ÁîÔòÊÇÒÑÕ¼ÓиöÔÏóµÄÏß³ÌÔÚÀ뿪ʱ,½«monitorµÄÖµ¼õ1,±íÃ÷¸ÃÏß³ÌÒѾ²»ÔÙ¶ÀÕ¼¸Ã¶ÔÏó.
ÓÃsynchronizedÐÞÊεķ½·¨½Ð×öͬ²½·½·¨,³ýÁËÕâÖÖ·½Ê½Ö®Íâ,»¹¿ÉÒÔʹÓÃͬ²½´úÂë¿éµÄÐÎʽ:
package com.cd.app;
class ShareVar {
private int count;
public void add() {
synchronized (this) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
public void sub() {
synchronized (this) {
count--;
}
}
public int getCount() {
return count;
}
} |
½ÓÏÂÀ´Í¬ÑùÊÇ¿´Ò»ÏÂËûµÄ×Ö½ÚÂë,Ö÷Òª¿´add()ºÍsub()·½·¨:
public void add();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=1
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: aload_0
5: dup
6: getfield #2 // Field count:I
9: iconst_1
10: iadd
11: putfield #2 // Field count:I
14: aload_1
15: monitorexit
16: goto 24
19: astore_2
20: aload_1
21: monitorexit
22: aload_2
23: athrow
24: return
public void sub();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=1
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: aload_0
5: dup
6: getfield #2 // Field count:I
9: iconst_1
10: isub
11: putfield #2 // Field count:I
14: aload_1
15: monitorexit
16: goto 24
19: astore_2
20: aload_1
21: monitorexit
22: aload_2
23: athrow
24: return |
ͬ²½´úÂë¿éºÍͬ²½·½·¨µÄʵÏÖÔÀíÊÇÒ»ÖµÄ,¶¼ÊÇͨ¹ýmonitorenter/monitorexitÖ¸Áî,ΨһµÄÇø±ðÔÚÓÚͬ²½´úÂë¿éÖÐmonitorenter/monitorexitÊÇÏÔʽµÄ¼ÓÔØ×Ö½ÚÂëÎļþµ±ÖеÄ.
ÉÏÃæÎÒÃÇͨ¹ýsynchronized½â¾öÁËÄÚ´æ¿É¼ûÐÔÎÊÌâ,ÁíÍâÒ²¿ÉÒÔÈÏΪ·²ÊDZ»synchronizedÐÞÊεķ½·¨»ò´úÂë¿é¶¼ÊÇÔ×ÓÐÔµÄ,¼´Ò»¸ö±äÁ¿´ÓÖ÷ÄÚ´æµ½¹¤×÷ÄÚ´æ,ÔÙ´Ó¹¤×÷ÄÚ´æµ½Ö÷ÄÚ´æÕâ¸ö¹ý³ÌÊDz»¿É·Ö¸îµÄ.
ÕýÈçÎÒÃÇÔÚ̸ÂÒÐòÖ´ÐкÍÄÚ´æÆÁÕÏËùÌáµ½µÄ,javac±àÒëÆ÷ºÍJVMΪÁËÌá¸ßÐÔÄÜ»áͨ¹ýÖ¸ÁîÖØÅŵķ½Ê½À´ÆóͼÌá¸ßÐÔÄÜ,µ«ÊÇÔÚijЩÇé¿öÏÂÎÒÃÇͬÑùÐèÒª×èÖ¹Õâ¹ý³Ì,ÓÉÓÚsynchronized¹Ø¼ü×Ö±£Ö¤Á˳ÖÓÐͬһ¸öËøµÄµÄÁ½¸öͬ²½·½·¨/ͬ²½¿éÖ»ÄÜ´®ÐнøÈë,Òò´ËÎÞÐÎÖ®ÖÐÒ²¾ÍÏ൱×èÖ¹ÁËÖ¸ÁîÖØÅÅ.
×ܽá
Ï£ÍûÕâô´ÓÏÂÍùÉÏ,ÔÙ´ÓÉÏÍùϵĽâÊÍÄÜÈø÷λͬѧ¶ÔJVMÄÚ´æÄ£ÐÍÒÔ¼°¶àḬ̈߳²È«ÎÊÌâÓиö¸üͨ͸µÄÀí½â.
|