Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
´Ó JVM ÄÚ´æÄ£ÐÍ̸Ḭ̈߳²È«
 
À´Ô´£º½­ºþÈ˳ÆÐ¡°×¸ç ·¢²¼ÓÚ£º 2017-5-17
  2765  次浏览      29
 

×÷Ϊһ¸öÈý¸ö¶àÔÂûÓÐÈ¥¹¤×÷µÄ¶ÀÁ¢¿ª·¢Õß¶øÑÔ,½ñÌìȥСÃ×ÃæÊÔÁËÒ»°Ñ.ÔõÃ´ËµÄØ,ÎÞÂÛÄãˮƽÈçºÎ,ÇëÈ·±£ÔÚÃæÊÔ֮ǰҪ×ö×¼±¸,¾ÍÏñÆäÖÐÒ»Î»ÃæÊÔ¹Ù˵µÄÒ»Ñù,ÎÒÖªµÀÄãˮƽ²»´í,µ«ÊÇÎÞÂÛÈçºÎÒ²ÊÇҪ׼±¸ÏµÄ,²»È»ÄãÔõô»áÁ¬Õâ¸ö·½·¨Ò²Íü¼ÇÁË?

´Ë¿Ì,ÎÒͻȻ¾õµÃÎÒÊÇÒ»¸ö¼Ù³ÌÐòÔ±.ΪʲôÕâÃ´ËµÄØ,×÷Ϊһ¸ö´Ó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ÄÚ´æÄ£ÐÍÒÔ¼°¶àḬ̈߳²È«ÎÊÌâÓиö¸üͨ͸µÄÀí½â.

   
2765 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö