ÕªÒª£ºÔÚJava20ËêÉúÈÕÕâÄ꣬ÎÒÃÇÓÃÕâÆªÎÄռǼÂìÒϽð·þÄÚ²¿£¬ÔÚ½ðÈÚÔÆ»·¾³ÏÂJavaϵͳµÄProfilingºÍDebugging¾ÑéÓëʵ¼ù£¬Óë´ó¼Ò·ÖÏí½»Á÷£¬Óзdz£ÌرðµÄÒâÒ塣ϣÍû¶ÁÕßÄܹ»´ÓÖÐ½è¼øµ½Ò»Ð©½â¾öÎÊÌâµÄ˼·¡£
´Ó1995ÄêJava1.0beta·¢²¼µ½ÏÖÔÚ£¬ÕûÕû¹ýÈ¥ÁË20Äê¡£JavaµÄ·¢Ã÷Ô´ÓÚǶÈëʽÁìÓò£¬²»¹ýºóÀ´JavaµÄ·¢Õ¹£¬³öºõÒâÁϵØÔÚÆóÒµ¼¶Ó¦ÓÃÁìÓòÕ¼¾ÝÁ˼¸ºõͳÖεĵØÎ»¡£°¢Àï°Í°ÍÒÔ¼°Ö§¸¶±¦£¨¾ÍÊǺóÀ´µÄÂìÒϽð·þ£©£¬¾ø´ó²¿·ÖµÄÒµÎñ´úÂë¶¼ÊÇJava±àдµÄ¡£ÔÚJava20ËêÉúÈÕÕâÄ꣬ÎÒÃÇÓÃÕâÆªÎÄռǼÂìÒϽð·þÄÚ²¿£¬ÔÚ½ðÈÚÔÆ»·¾³ÏÂJavaϵͳµÄProfilingºÍDebugging¾ÑéÓëʵ¼ù£¬Óë´ó¼Ò·ÖÏí½»Á÷£¬Óзdz£ÌرðµÄÒâÒ塣ϣÍû¶ÁÕßÄܹ»´ÓÖÐ½è¼øµ½Ò»Ð©½â¾öÎÊÌâµÄ˼·¡£

ÏßÉÏProfiling/DebuggingÄѵã
ÔÚ¼¯ÖÐʽ¼Ü¹¹µÄʱ´ú£¬Ó¦Óð´ÕÕ´óµÄÒµÎñ¹¦ÄÜ»®·ÖΪ²»Í¬µÄÄ£¿é»òÕßϵͳ£¬ÎÞÂÛÔÚϵͳÀàÐÍ¡¢ÊýÁ¿»¹ÊÇÒÀÀµÉÏ£¬¾ùÏà¶Ô¿É¿Ø£¬Ò»µ©³öÏÖÏßÉÏÎÊÌâÒ²ÈÝÒ×ÔÚÏßÏÂÄ£Äâ·ÖÎö¡£µ«½¨Á¢ÔÚ·Ö²¼Ê½¼Ü¹¹ÌåϵÉϵÄÓ¦ÓþßÓÐÊýÁ¿¶à¡¢¹æÄ£´ó¡¢»·¾³¸´ÔÓµÄÌØµã¡£ÕâÐ©ÌØµã´øÀ´Á˺ܶàÎÊÌ⣬²»Êǵ¥Ò»µÄ¹¤¾ßºÍϵͳÄܽâ¾öµÄ¡£ÕâÀï½ö×ÅÖØ½²Êö¸øProfilingºÍDebugging¹¤×÷´øÀ´µÄÌôÕ½¡£
Òò°²È«ÎÊÌâÔö¼ÓµÄȨÏÞ¿ØÖÆ¡£ÔÚSOA¼Ü¹¹Ï£¬ÏµÍ³¼äͨ¹ý·þÎñ½øÐÐͨÐÅ£¬µ«²»ÊÇËùÓзþÎñ¶¼¿ÉÒÔ¹«¿ª±©Â¶£¬²»ÊÇËùÓпͻ§¶Ë¶¼ÊÇ¿ÉÐŵġ£ÓÚÊÇϵͳÖÐÔö¼Ó¸÷ÖֹܿغÍȨÏÞÉèÖá£ÕâЩ°²È«´ëÊ©¸øProfilingºÍDebugging¹¤×÷´øÀ´ºÜ´óµÄÂé·³¡£±ÈÈçÍøÂç¸ôÀ룬µ¼ÖÂÎÞ·¨Ö±½ÓʹÓÃÓмò±ãͼÐνçÃæµÄEclipseÈ¥Ô¶³Ìµ÷ÊÔÏßÉÏ·þÎñÆ÷¡£¼´Ê¹µÇ¼µ½·þÎñÆ÷ÉÏʹÓÃÃüÁîÐй¤¾ß£¬Ò²ÃæÁÙ×ŵǼÕË»§È¨ÏÞ¡¢sudoȨÏÞÒÔ¼°Ô´Âë²é¿´È¨ÏÞµÈһϵÁÐȨÏÞÉêÇëÎÊÌ⣬¼«´óµØ½µµÍÁËÎÊÌⶨλЧÂÊ¡£
Àà¿âÒÀÀµ¸´ÔÓ£¬°æ±¾Ë鯬»¯¡£Àà¿âµÄ¸´ÓÃÊÇϵͳÉè¼ÆµÄ¾µä·¨Ôò£¬µ«Ëæ×Åϵͳ¹æÄ£Ôö¼Óµ½°ÙÉõÖÁǧ¼¶¹æÄ£Ê±£¬Ã¿¸öϵͳ¶ÔÀà¿âµÄÒÀÀµ¾Í»áÐγɶàÖÖÅÅÁÐ×éºÏ£¬¶øÇÒÀà¿âµÄ°æ±¾·Ö²¼Ò²³ÊË鯬»¯¡£ProfilingºÍDebuggingʱÐèÒªÕë¶Ô¾ßÌåµÄϵͳ²éÕÒÏà¹ØÀà¿âµÄ°æ±¾ºÅ£¬È»ºóÔÙÕÒ¶ÔÓ¦µÄ´úÂ룬±È½Ï·±Ëö¡£
¼Ü¹¹¹æ·¶Ò×ÖÆ¶¨Äѱ£³Ö£º¼Ü¹¹¹æ·¶ÔÚµ¥ÌåÊýÁ¿ÖÚ¶àÇÒÏà¶Ô²»¿É¿ØµÄÇé¿öÏÂÏÔµÃÓÈÎªÖØÒª£¬µ«ÓÖÒòΪϵͳ·ÖÉ¢£¬¹æÄ£ÅӴ󣬼ܹ¹¹æ·¶µÄ±£³Ö½«»áÊ®·ÖÀ§ÄÑ£¬Ã¿´ÎÒýÈëϵͳ±ä¸üµÄͬʱ¾Í»áÒýÈëи´ÔÓ¶ÈºÍÆÆ»µ¼Ü¹¹¹æ·¶µÄ·çÏÕ£¬´úÂëÒ²»áËæÖ®²úÉúһЩ¡°badsmell¡±¡£Òò´ËÔÚ·Ö²¼Ê½»·¾³Ï£¬ÎÊÌâµÄ³¤Î²Ð§Ó¦·Ç³£Ã÷ÏÔ¡£Ò»¸öϵͳ·¢ÏÖµÄBug»òÕßÐÔÄÜÎÊÌ⣬¿ÉÄÜÔÚºóÐø±È½Ï³¤µÄÒ»¶Îʱ¼ä»áÔÚ²»Í¬µÄϵͳÖÐÖØ¸´³öÏÖ¡£·´¹ýÀ´£¬Ò»Ð©Í¨³£ÈÏΪ³öÏÖ¸ÅÂʺܵ͵ÄÎÊÌ⣬ÔÚ»úÆ÷ÊýÁ¿´óµÄÇé¿öÏ£¬³öÏֵĻú»á»¹ÊǺܴóµÄ¡£
ÇëÇóµ÷ÓÃÁ´Â·¸ú×ÙÀ§ÄÑ¡£Ä£¿éºÍϵͳ²ð½âµÃԽϸ£¬·þÎñ¾ÍÔ½¶à£¬ÏµÍ³¼äµÄÒÀÀµ¹ØÏµ¾ÍÔ½¸´ÔÓ£¬ÔÚSOA¼Ü¹¹Ï£¬Ëæ×Åϵͳ¹æÄ£µÄÔö¼Ó£¬·þÎñµÄÉÏÏÂÓÎÒÀÀµ½«´í×Û¸´ÔÓ£¬ÏµÍ³¼äµÄÒÀÀµºÍƽ̨֮¼äµÄÒÀÀµ¸´ÔÓ¶ÈÒ²½«¼±¾çÔö¼Ó¡£Ò»¸ö·Ö²¼Ê½ÏµÄÇëÇó´ÓÓû§µã»÷µ½ÊÕµ½ÏìÓ¦£¬Í¾ÖÐÍùÍù»á¾¹ýN¸öϵͳ£¬»òÕß˵N̨ÔËÐÐ×Ų»Í¬ÏµÍ³µÄ·þÎñÆ÷£¬Ã¿Ì¨·þÎñÆ÷ͬһʱ¿Ì¶¼²¢·¢´¦ÀíןܶàÇëÇó¡£ÕâÐèÒªProfilingºÍDebuggingϵͳ¼ò½àÃ÷Á˵ØÕ¹Ê¾·ÖÎö½á¹û£¬Èÿª·¢ÈËÔ±Äܹ»¿ìËÙÅжϳöÆäÖÐij¸ö½ÚµãÊÇ·ñÓÐÎÊÌ⣬ÒÔ¼°ÎÊÌâµÄÑÏÖØ³Ì¶È£¬½«¸ü¶àµÄ¾«Á¦·ÅÔÚµ÷ÓÃÁ´Â·ÔÚ¸÷¼¯ÈºÖеÄ×ßÏòµÈ¸üÉϲãÐÅÏ¢µÄ·ÖÎöÉÏ¡£±Ï¾¹ÔÚ´ó¹æÄ£·Ö²¼Ê½ÏµÍ³ÖУ¬±£Ö¤ÏµÍ³µÄ¿ÉÓÃÂÊÊǵÚһλµÄ£¬¶ø²»Ó¦¸ÃÔÚÒ»¸öϸ½ÚµÄÎÊÌâÉϾÀ²øºÜ¾Ã¡£
ÏßÉÏÎÊÌâÄÑÒÔÖØÏÖ£ºÏßÉÏÎÊÌâÓÐʱÓë»·¾³Óйأ¬ÏßÏÂÄÑÒÔ¸´ÏÖ£¬ÓÐʱÓÖÊÇż·¢ÐÔ³öÏÖ£¬ÄÑÒÔ²¶×½¡£Ëæ×Åϵͳ¸´ÔӶȵÄÔö¼Ó£¬ÏßÉÏÎÊÌâµÄ¿ìËÙ¶¨Î»ºÍʵʱ·ÖÎö½«ÊÇÒ»Ïî¾Þ´óÌôÕ½£¬Ò»°ãÖ»ÄÜ¿¿ÈËÀ´½â¾ö£¬µ«È˵ÄÎÊÌâÅŲéÄÜÁ¦µÄÌáÉýÐèÒªÒ»´Î´ÎµÄ¹ÊÕÏÀ´»»È¡£¬ÐèÒª³¤ÆÚµÄ¾Ñé»ýÀÛ£¬¶øÇÒ¾Ñ黹ºÜÄÑ´«³Ð£¬Ò»µ©¹Ø¼üÈËÔ±Á÷ʧ£¬Õû¸öÍŶӵÄÎÊÌâ½â¾öÄÜÁ¦¾ÍϽµÁË£¬Õâ¸ö´ú¼ÛÒ²ÈÃÈËÄÑÒÔ½ÓÊÜ¡£ÐèÒªÓÐÒ»¸ö·½±ãµÄ³Áµí¾ÑéµÄµØ·½£¬¸üºÃµÄ×ö·¨Êǽ«ÕâÖÖ±¦¹óµÄ¾Ñé³Áµíµ½ProfilingºÍDebugging¹¤¾ßÖС£
ÓëProfilingºÍDebuggingÏà¹ØµÄ£¬ÂìÒϽð·þÄÚ²¿¿ª·¢Ê¹ÓÃÓÐÁ½¿î²úÆ·£ºZProflierÓëZDebugger¡£¹ËÃû˼Ò壬ZProfilerÖ÷ÒªÓÃÓÚProfling£¬¶øZDebuggerÖ÷ÒªÓÃÓÚDebugging¡£ÂìÒϽð·þÒ²ÓÐ×Ô¼º»ùÓÚOpenJDK¶¨ÖÆ£¬ZProflierºÍZDebuggerµÄ´ó¶àÊý¹¦ÄÜÊÇ¿ÉÒÔÖ±½ÓÔÚ±ê×¼µÄJDKÉÏÔËÐеģ¬Ö»ÊÇһЩ¸ß¼¶ÌØÐÔÐèÒªÅäºÏÎÒÃǶ¨ÖƵÄJDKʹÓã¬Õâ¸öÎÒÃǺóÃæÒ²»á̸µ½¡£Õë¶ÔÇ°ÃæÌáµ½µÄÌôÕ½£¬ÎÒÃǵIJúÆ·ÓÐÈçÏÂÌØµã¡£
- ×÷ΪÂìÒϽð·þ½ðÈÚÔÆµÄÒ»²¿·Ö£¬Óë·þÎñÆ÷Ò»ÆðÔËÐÐÔÚ¸ôÀëµÄÍøÂçÖУ¬½â¾öÍøÂç¸ôÀëÎÊÌâ¡£
-
²¿·Ö¹¦ÄÜ×÷ΪJVMTiÀ©Õ¹£¬Ö±½Ó¼¯³ÉÔÚ½ðÈÚÔÆÉú²ú»·¾³Ê¹ÓõÄJDKÀ²»ÐèÒª·±ËöµÄȨÏÞÉêÇë¡£
-
ÈÃProfilingºÍDebuggingÖ§³ÖLateAttach£¬ÕâÒâζ×ÅÓû§²»ÐèÒªÖØÆôÓ¦Óã¬ËæÊ±¿ÉÒÔ¶ÔÈκÎһ̨·þÎñÆ÷½øÐÐÎÊÌⶨλºÍ·ÖÎö¡£
-
ÕûºÏ¸÷ÖÖ³£ÓúͲ»³£ÓõÄProfiling/Debugging¹¦ÄÜ£¬²¢¾¡Á¿´òͨ¹¦ÄÜÖ®¼äµÄÁªÏµ£¬ÌṩһվʽµÄ·þÎñ£¬²»ÐèÒª¿ª·¢ÈËÔ±ÔÚ²»Í¬µÄ¹¤¾ß¼äÇл»¡£
-
¼¯³ÉÔ´Âë¹ÜÀí¹¦ÄÜ£¬×Ô¶¯ÏÂÔØÄ¿±êϵͳ¶ÔÓ¦µÄÔ´´úÂëµ½ZDebugger·þÎñÆ÷£¬²»Õ¼Óÿª·¢ÈËÔ±µÄÓ²Å̺Íʱ¼ä¡£
-
¼¯³ÉȨÏÞ¹ÜÀí£¬Óû§Ö»ÒªÔڵǼZProflierÓëZDebuggerϵͳʱ½øÐÐÒ»´ÎÈÏÖ¤£¬ºóÐø¸÷Ïî²Ù×÷£¨±ÈÈ翽±´heapdumpÎļþ£©µÄȨÏÞÎÊÌâÓÉϵͳ´úΪ´¦Àí¡£
-
¼¯³ÉÎÊÌâ¶Ô±È¡¢¹Ø¼ü´Ê²éÕÒ¡¢°¸Àý·ÖÏíµÈ¹¦ÄÜ£¬·½±ãÖØ¸´ÎÊÌâ²éÕҺ;Ñé´«³Ð¡£
³£¼ûÎÊÌâ½â¾ö˼·
ÏÂÃæ½éÉÜһϴ¦ÀíһЩ³£¼ûµÄÎÊÌâʱ£¬Ê¹ÓÃZProflierºÍZDebuggerϵͳÓëʹÓô«Í³¹¤¾ßÔÚÁ÷³ÌºÍ˼·ÉϵÄÒ»Ð©Çø±ð¡£Ò»¸öÐÂÉÏÏßµÄϵͳÈç¹û´¦ÀíÄÜÁ¦´ï²»µ½ÎÒÃǵÄÔ¤ÆÚ£¬»òÕßÒ»¸öÀϵÄϵͳ´¦ÀíËÙ¶ÈͻȻϽµÁË£¬ÒÖ»òƵ·±Å׳öÒì³££¬ÕâЩ¶¼´ÙʹÎÒÃÇȥ˼¿¼ÏµÍ³´æÔÚÐÔÄÜÎÊÌâ¸ÃÓÅ»¯ÁË£¬ÄÇÎÒÃÇͨ³£»áÅöµ½µÄÐÔÄÜÎÊÌâÓÐOOM¡¢CPUÕ¼ÓÃÂʸߡ¢Load¸ß¡¢Æµ·±GCµÈ¡£OOMµÄÏÖÏóΪJava½ø³ÌÖ±½ÓÍ˳ö£¬³ö´íÈÕÖ¾Àï¿ÉÒÔ¿´µ½OutOfMemoryErrorµÄÒì³£¡£Èç¹û·¢ÏÖÆµ·±µÄ×öMajorGCÉõÖÁÊÇFullGC£¬Ò»°ãÒ²ÊÇOOMµÄǰÕס£½â¾ö´ËÀàÎÊÌâµÄÖ÷ÒªÊÖ¶ÎÊÇ·ÖÎöheapdump¡£
JDK×Ô´øjmap¹¤¾ß£¬Ê¹ÓÃÃüÁîjmap-dump:live,format=b,file=heap.bin¼´¿É½«Java½ø³ÌµÄheapÄÚ´æ°´ÕÕHPROFBinaryFormatµÄ¸ñʽdump

ͼ1ZProfiler
µ½Ãû×ÖΪheap.binµÄÎļþÀï¡£ÃüÁîÖеÄlive²ÎÊý£¬ÒâζÔÚdump֮ǰ»á×öÒ»´ÎFullGC£¬±£Ö¤dump³öÀ´µÄ¶ÔÏó¶¼¾¡Á¿ÊÇ»îµÄ¶ÔÏ󣬼õÉÙheap.binµÄ´óС£¬½µµÍ¹¤¾ßµÄ·ÖÎöʱ¼ä¡£ÊÇ·ñÒªÉèÖÃÕâ¸ö²ÎÊýÒªÊÓ¾ßÌåÎÊÌ⣬±ÈÈçÏëÖªµÀoldÇøµ½µ×Ϊʲô»áÔö³¤Õâô¿ì£¬¶¼Ôö¼ÓÁËЩʲô¶ÔÏóÄØ£¿Õâ¸öʱºòÄã¿ÉÄÜû±ØÒªÈ¥¼Ólive²ÎÊýÁË£¬Ö»ÒªÁ¬Ðø×öÁ½´Îheapdump£¬È»ºó×öÒ»´ÎÄÚ´æ¶Ô±È£¬¾ÍÖªµÀÕâ¶Îʱ¼äÄÚÔö¼ÓÁËÄÄЩ¶ÔÏó¡£µ«Èç¹ûÄãÏëÕÒ³öһЩ³¤Ê±¼ä²»ÊͷŵĶÔÏ󣬷ÖÎöÆä¸ùÒýÓÃÊ÷ÊÇÔõÑùµÄ£¬Õâʱ¼ÓÉÏlive²ÎÊýÀ´dump¾Í±È½ÏºÏÀí¡£
³£ÓõÄheapdump·ÖÎö¹¤¾ßÊÇEclipseMemoryAnalyzerTool£¬¼ò³ÆMAT¡£Õâ¿î¹¤¾ß¹¦ÄܺÜÇ¿´ó£¬µ«ÕýÓÉÓÚËü¹ýÓÚÇ¿´ó£¬Òò´Ë¸ø³õѧÕß´øÀ´µÄѧϰ³É±¾Ò²±È½Ï¸ß¡£Æä´ÎËüÊÇÒ»¸ö¿Í»§¶Ë³ÌÐò£¬ÐèÒª°²×°ÔÚ±¾µØ£¬Òò´ËËüÒ²ÊÜÏÞÓÚ±¾µØµÄ»úÆ÷ÐÔÄÜ£¬±ÈÈç±¾»úÄÚ´æ¾Í4GB£¬¶øheapÎļþ´óСΪ8GB£¬ÕâʱMAT¾ÍÎÞ·¨Íê³É·ÖÎö¹¤×÷ÁË¡£ÒòΪMAT±¾ÉíÒ²ÊÇJava³ÌÐò£¬ËüÔÚ·ÖÎö´óheapʱ»á³öÏÖ²»¶Ï×öGC£¬ÉõÖÁfullgcµÈÒì³£Çé¿ö£¬µ¼Ö·ÖÎöûÓнá¹û¡£Õë¶ÔÕâЩÎÊÌ⣬ÎÒÃǵÄÐÔÄÜ·ÖÎö²úÆ·ZProfiler¾«¼õÁ˲¿·Ö²»³£ÓõŦÄÜ£¬±£Ö¤¾ø´ó²¿·ÖÓû§Ê¹ÓÃÉϵļò±ãÐÔ¡£ÁíÍâZProfilerÊǸöWebϵͳ£¬ÔËÐÐÔÚһ̨·þÎñÆ÷ÉÏ£¬·ÖÎöÄÜÁ¦²»ÔÙÊÜÏÞÓÚ¿ª·¢ÈËÔ±µÄ»úÆ÷ÐÔÄÜ£¬¶øWebUI²Ù×÷µÄ·½Ê½Ò²´ó´ó¼õÇáÁË¿ª·¢ÈËÔ±µÄ¹¤×÷Á¿¡£
CPU¸ßµÄÎÊÌâÐèÒª·Ö²ãÀ´¿¼ÂÇ£¬Ê×Ïȼì²é²Ù×÷ϵͳ²ãÃæµÄһЩÔÒò£¬±ÈÈçÆµ·±µÄmemorypaging£¬¿ÉÄܵ¼ÖÂJavaÓ¦ÓÃÔÚÄÚºË̬»¨·ÑµÄʱ¼ä½Ï¶à¡£Ò²¿ÉÒÔʹÓÃperftop¼ì²éJVMÄÚ²¿±ÈÈçJIT£¬GCÏ̵߳ÄCPUʹÓÃÇé¿ö¡£Èç¹ûJITÏß³ÌʹÓõÄCPU½Ï¸ß£¬¾ÍÐèÒª¿´¿´codecache»òÕ߯äËûJITÏà¹Ø²ÎÊýÊÇ·ñÉèÖúÏÀí£»Èç¹ûÊÇgcỊ̈߳¬¾ÍÐèÒª½øÒ»²½·ÖÎögclog£¬È»ºóµ÷ÕûGCÏà¹ØµÄ²ÎÊýµÈ¡£
ÅųýÒÔÉÏÔÒòÖ®ºó£¬»ù±¾¿ÉÒÔÈ·ÈÏÊÇJava´úÂëµÄÎÊÌ⣬¿ÉÒÔʹÓÃZProfilerÌṩÁËHotMethodProfiling¹¦Äܲ鿴Èȵ㷽·¨£¬Õâ¸öºóÃæÓÐÏêϸÃèÊö¡£
Load¸ßÒâζ×ÅÔËÐеÄÏ̻߳òÕßÔËÐжÓÁÐÀïµÄÏ̱߳Ƚ϶࣬´Ëʱ¿ÉÒÔͨ¹ýÏß³Ìdump½øÐÐÅŲ顣Ïß³Ìdump£¬¿ÉÒÔʹÓÃJDK×Ô´øµÄ¹¤¾ßjstack£¬Ö´ÐÐÃüÁîjstack¼´¿É£¬»á½«½ø³ÌµÄËùÓÐJavaÏ̸߳ødump³öÀ´¡£Èç¹û»¹Ïë¸ú×ÙnativeµÄ¶ÑÕ»£¬ÐèÒªÔö¼Ó-m²ÎÊý¡£µ±Äõ½Ïß³ÌdumpÖ®ºó£¬°´ÕÕÏß³Ì״̬½øÐйéÀࡾע£ºJVMÀïdump³öÀ´µÄÏß³ÌÈÕÖ¾£¬Ï̵߳Ä״̬²¢²»ÊÇ100%µÄ׼ȷ£¬Ï¸½Ú¿ÉÒԲο¼JVMBug£º¶à¸öÏ̳߳ÖÓÐÒ»°ÑËø£¿¡¿¡£¶ÔÓÚͬһ¸öϵͳ£¬Load¸ßµÄ»úÆ÷RUNNABLE̬µÄÏß³ÌÊýĿһ¶¨±ÈLoadµÍµÄ»úÆ÷¶à¡£ÎÒÃÇ¿ÉÒÔͨ¹ýthreaddumpÀ´·ÖÎöÕâЩ¶à³öµÄÏ̶߳¼ÔÚ¸ÉÂ´Ó¶øÕÒµ½Load¸ßµÄÔÒò¡£
Õë¶ÔÏ̷߳ÖÎö£¬ZProfiler²»½ö½ö´Ó״̬Á£¶ÈÌṩÁË·ÖÎö£¬»¹´ÓËøÁ£¶ÈÒÔ¼°ÈȵãÕ»Á£¶È×öÁËͳ¼Æ·ÖÎö£¬ZProfiler¿ÉÒÔ°ïÖúÓû§¿´µ½Ò»°ÑËøÓ°Ïìµ½ÁËÄÄЩỊ̈߳¬ÄĸöÏ̳߳ÖÓÐÕâ°ÑËø£¬ÄÇЩÏß³ÌÕýÔڵȴýÕâ°ÑËø£¬¶ÔÓÚÏß³ÌÊýÒòΪͬ²½ËøµÄÎÊÌâͻȻ´óÔö»ù±¾¿ÉÒÔͨ¹ýZProifilerµÄ·ÖÎö½á¹û¿´³öÎÊÌâÔÚÄÄÀͬÑùµÄ£¬¶ÔÓÚij¸ö·½·¨ÔÚÄÄЩÏß³ÌÀï»òÕßÔËÐÐ̬µÄÏß³ÌÀïÕýÔÚÕ»ÉÏÖ´ÐУ¬ZProfilerÒ²ÌṩÁËͳ¼Æ£¬·½±ãÓû§ÅŲéLoad¸ßµÈÎÊÌâ¡£
ͼ2 ZDebugger
GCƵ·±ÊÇJava³ÌÐò×î³£¼ûµÄÎÊÌâÖ®Ò»£¬´ó¶àÊýÇé¿ö϶¼ÊÇÓÉÓÚÏà¹Ø²ÎÊýÅäÖò»ºÏÀíµ¼Öµġ£HotSpotGCÏà¹ØµÄÉèÖòÎÊý±È½Ï¶à£¬ÒªÕÒµ½±È½ÏºÏÀíµÄ²ÎÊýÉèÖã¬Ê×ÏÈÒª¶ÔÓ¦ÓõÄÄÚ´æÇé¿öÓÐÒ»¸ö×ÜÌåµÄÁ˽⣺±ÈÈçÓ¦ÓÃÔËÐÐÎȶ¨ºó£¬LiveDataSize´ó¸ÅÊǶàÉÙ£¬Õâ¸ö»áÓ°Ïìµ½-Xmx/-Xms/-XmnµÄÉèÖôóС¡¾×¢£ºCharlieHunt/BinuJohnºÏдµÄJavaPerformanceÌṩÁ˺ܺõÄGuide¡¿£»ÔËÐйý³ÌÖд´½¨µÄ¶ÔÏótemp¶ÔÏóºÍlonglived¶ÔÏóµÄ´ó¸Å±ÈÂÊ£¬Õâ¸ö»áÓ°Ïìµ½heapÀÏÇøÐÂÇøµÄÉèÖñÈÀý¡£
²é¿´GCÇé¿öͨ³£ÓÐÁ½ÖÖ·½Ê½£¬Ò»ÖÖÊÇ´ò¿ªgclogÏà¹ØµÄ²ÎÊý£¬Êºó·ÖÎögclog£»ÁíÍâÒ»ÖÖÊÇʵʱ»ñÈ¡GCÐÅÏ¢£¬¿ÉÒÔ´ò¿ªJMX½Ó¿Úͨ¹ýÏà¹ØµÄMXbean»ñÈ¡£¬»òÕßͨ¹ýjstatÃüÁî¡£
gclog·ÖÎöÊǸö¿à²î£¬ÒòΪgclogÊä³öµÄÐÅÏ¢·Ç³£¶à£¬µ«ÊǺܶàʱºòÎÒÃÇÐèÒª¹Ø×¢µÄÊdz¤ÆÚµÄÇ÷ÊÆºÍÕûÌåµÄͳ¼ÆÐÅÏ¢£¬È˹¤·ÖÎöÌ«ºÄʱ¼ä¡£Ä¿Ç°Ò²ÓÐһЩ²»´íµÄgclog·ÖÎö¹¤¾ß£¬±ÈÈçGCViewer¡£ZProfiler³ýÁË×öÁ˺ÍGCViewerÀàËÆµÄ¹¤×÷Ö®Íâ£¬Ç°ÃæÌ¸µ½¹ý£¬ZProfilerϵͳ±¾Éí¾ÍÊDz¿ÊðÔÚ½ðÈÚÔÆÀïµÄ£¬ÕâÒâζ×ÅÓû§¿ÉÒԷdz£·½±ãµØÍ¨¹ý¼òµ¥µÄWebUI²Ù×÷°ÑgclogÖ±½Ó¸´ÖƵ½ZProfilerÉÏÀ´·ÖÎö¡£ÁíÍ⣬ÎÒÃÇÒ²ÕýÔÚ¿ª·¢Ò»Ð©¸ü¸ß¼¶µÄһЩ¹¦ÄÜ£¬ÔÚgclog·ÖÎöÍê³Éºó£¬¸øÓû§Ò»Ð©Ö±½ÓµÄ½¨Ò飬±ÈÈçÊÇ·ñGCPauseµÄʱ¼ä¹ý³¤£¬ÉèÖõÄGC²ÎÊýÓ¦¸ÃÈçºÎµ÷Õû£¬GC»¨·ÑµÄCPUʱ¼äÊDz»Êǹý³¤µÈ¡£
ʵʱ»ñÈ¡GCÐÅÏ¢·½Ã棬VisualVMµÄVisualGC²å¼þ×öµÄ²»´í£¬·Ç³£Ö±¹ÛµØÏÔʾ³öµ±Ç°Ó¦ÓõÄGCÇé¿ö£¬µ«ÊÇ·ÖÎö·½Ãæ×öµÄ²»¹»¡£ZProfilerͬÑùʹÓÃMXBeanµÄ·½Ê½»ñȡʵʱµÄGCÐÅÏ¢£¬½«¸üÓмÛÖµºÍ¸ü¾ßͳ¼ÆÒâÒåµÄÐÅϢչʾ³öÀ´¡£¶ø¶ÔÓÚÔÆÉÏÄÑÒÔ¸´ÏÖ¡¢Å¼·¢ÐÔµÄÎÊÌ⣬ÎÒÃÇÍÆ¼öʹÓÃÔÚÏßµ÷ÊÔÆ½Ì¨ZDebugger¶ÔÔËÐÐÖеijÌÐò½øÐÐÔÚÏßµ÷ÊÔ¡£ÔÚÏßµ÷ÊÔµÄÔÔòÊÇ·½±ãÓû§¼òµ¥¿ìËٵشò¿ªµ÷ÊÔÆ÷£¬ÇÒ²»ÄÜÓ°ÏìÓ¦ÓõÄÕý³£ÔËÐС£»ùÓÚ´Ë˼·£¬ZDebuggerÉè¼ÆÎª»ùÓÚJettyµÄWeb·þÎñÆ÷£¬Óû§Ê¹ÓÃä¯ÀÀÆ÷¼´¿É·¢Ë͵÷ÊÔÃüÁî¡£µ÷ÊÔÆ÷ʹÓÃJDWPÐÒéͨ¹ýÍøÂçÓë±»µ÷ÊÔµÄJVMºó¶ËÁ¬½Ó£¬ÔÚ²»ÖØÆôJVMµÄÇé¿ö϶¯Ì¬´ò¿ªJVMµ÷ÊÔ¹¦ÄÜ£¬JVMÔÚ²»×è¶ÏÓ¦ÓÃÔËÐеÄǰÌáϼ´Ê±×¥È¡¶Ïµã´¦µÄÔËÐÐÐÅÏ¢²¢½«Æä·µ»Ø¡£
JDK¶¨ÖÆ
×îºó̸һÏÂÎÒÃÇÔÚOpenJDKÖеÄһЩ¶¨ÖÆ¡£Ö÷Òª¼ÓÈëÁËDebug-on-Late-Attach(aka.DOLA)¡¢Fast-SnapshotAt-Breakpoint(aka.FSAB)ÒÔ¼°HotMethodProfilingµÈ¹¦ÄÜ¡¾×¢£ººóÐøÎÒÃÇÒ²»áºÍOpenJDKÉçÇøÌÖÂÛÔõôÄܰÑÕâЩ¸Ä¶¯±ê×¼»¯£¬²¢¹±Ï×µ½ÉçÇø,ÆäÖеÄһЩ²¿·ÖÒѾ¿ªÊ¼ÁËÌÖÂÛ¡¿¡£
DOLA¼´ÔÚ²»ÖØÐÂÆô¶¯JVMµÄÇé¿öÏ£¬¿ÉÒÔ°Ñ¡°ÓÐÏ޵ġ±µÄJavaµ÷ÊÔ¹¦ÄÜ´ò¿ª¡£Õâ¸ö¹¦ÄܶÔÓÚÉú²ú»·¾³µÄµ÷ÊÔÀ´Ëµ·Ç³£ÓÐÒâÒå¡£¾¡¹ÜĿǰÖ÷Á÷µÄÉÌÒµJVM»ù±¾¶¼Ðû³Æ¡°full-speeddebugging¡±£¬µ«ÔÚʵ¼ÊµÄʹÓÃÖУ¬ÎÒÃÇûÓжàÉÙÈËÖ±½Ó°ÑJVMµÄµ÷ÊÔÄÜÁ¦ÔÚÉú²ú»·¾³Ö±½Ó´ò¿ª¡¾×¢£ºÔÚJVMÆô¶¯Ê±¼Ó-agentlib:jdwpÉèÖòÎÊý£¬¾Í¿ÉÒÔ´ò¿ªJVMµ÷ÊÔ¡¿£¬ÒòΪÊÂʵÉÏ»¹ÊǶÔÓ¦ÓõÄÐÔÄÜÓÐÓ°ÏìµÄ¡£±ÈÈ磬¶ÔÓÚJITµÄÓ°Ï죬µ÷ÊÔģʽÏÂEscapeAnalysis¹¦ÄÜÊDZ»×Ô¶¯¹ØµôµÄ£¬¶øÇÒһЩ½âÊÍÆ÷µÄfastpathÒ²¿É»áÊܵ½Ó°Ï죬¶ø×ßslowpath¡£ËùÒÔµ±ÏßÉÏÎÊÌâ³öÏÖʱ£¬ÍùÍùÒªÇóÖØÐÂÆô¶¯ÎÊÌâJVM£¬°ÑDebug¹¦ÄÜ´ò¿ªµ÷ÊÔ£¬¶øÞÏÞÎÔÚÓÚ£¬ÖØÆôJVMÍùÍù»áµ¼ÖºÜÄÑÔÙÏÖÎÊÌⳡ¾°¡£Õâ¸öÊÇÎÒÃǸÄÔìJDK£¬¼ÓÈëDOLAµÄ³õÖÔ¡£
DOLAÔÊÐíÓû§Í¨¹ýjcmdÃüÁ̬°ÑJVMµÄ¡°ÓÐÏ޵ġ±µ÷ÊÔ¹¦ÄÜ´ò¿ª£¬Í¨¹ýZDebugger£¬Óû§¿ÉÒÔ¶Ô±»µ÷ÊÔµÄJVMÉèÖöϵãÒÔ¼°²é¿´±äÁ¿µÄÖµ£¬ÕâÁ½¸ö¹¦ÄܶÔÎÒÃÇÀ´ËµÒѾ×ã¹»°ïÖúÎÒÃÇ·¢ÏÖºÍÕï¶ÏÏßÉϵĴ󲿷ÖÎÊÌâ¡£
DOLA¶¨Öƽâ¾öµÄÄѵãÖ÷ÒªÔÚÕâô¼¸¸ö·½Ãæ¡£
- jdwpagent¸ÄÔ죬֧³ÖAgent_OnAttach½Ó¿Ú£¬ÕâÑù¿ÉÒÔͨ¹ýÀ©Õ¹µÄjcmdÃüÁî°ÑjdwpagentÔÚÔËÐÐʱ¼ÓÔØµ½TargetJVM¡£
-
Interpreter¸ÄÔ죬ÔÚBytecodepatch·¾¶ÉÏÖ§³Ö¶ÏµãÉèÖÃÂß¼¡¾×¢£º¹ØÓÚHotSpotBytecodepatch£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒԲο¼RewriteBytecodes/RewriteFrequentPairsµÈÏà¹ØÊµÏÖ»úÖÆ¡¿¡£
-
·½·¨De-optimization»úÖÆ¸ÄÔ죺±ê×¼µÄHotSpotJVMʵÏÖ£¬Óû§ÉèÖöϵ㣬ÉèÖöϵãµÄµ±Ç°·½·¨±»deoptimizeµ½½âÊÍÆ÷°æ±¾¡£¶øÎÒÃǶ¨ÖƵÄHotSpot»á°ÑËùÓеķ½·¨ÔÚÕâ¸öµãÉ϶¼de-optimizeµô£¬ÕâÊÇÓÉÓÚÎÒÃÇÔÚJVMÆô¶¯µÄʱºòûÓпªÆôµ÷ÊÔ£¬JIT¾ÍûÓмǼÓÃÓÚÉèÖöϵãµÄ·½·¨dependencyÐÅÏ¢£¬De-optimizeËùÓеķ½·¨»á°ïÖúJITÔÚºóÐøµÄ±àÒë°æ±¾Àï¼Ç¼ÏÂdependencyÐÅÏ¢¡£
FSABµÄ×÷ÓÃÊÇÅäºÏZdebuggerϵͳµÄwatchpointµ÷ÊÔģʽ¡£ÕâÖÖģʽ½è¼ø×ÔGoogleµÄclouddebugger£¬ÆäÓ¦Óó¡¾°ÊÇ£ºÔÚÔÆ»·¾³ÖУ¬´«Í³µÄSingleStepµ÷ÊÔģʽ¸ù±¾²»¿ÉÐУ¬ÒòΪÉèÖöϵ㲢µ¥²½µ÷ÊÔ£¬»áÔì³ÉÏß³Ì×èÈû£¬µ¼ÖÂϵͳ³öÏÖ³¬Ê±µÈ¸÷ÖÖÎ޹صĴíÎó£¬ÉõÖÁÍþвÕû¸öϵͳÕý³£ÔËÐС£
¶øwatchpointµ÷ÊÔģʽÊÇÔڶϵãͣס֮ºó£¬×Ô¶¯½«µ÷ÓöÑÕ»¡¢¸÷²ãµÄ¾Ö²¿±äÁ¿£¬ÒÔ¼°Óû§ÉèÖõıí´ïʽµÄÖµ¿ìËÙµØÈ¡³öÀ´£¬È»ºóDisable¶Ïµã£¬²¢Continueµ±Ç°Ö´ÐС£¶ÏµãÐèÒªÓû§Ö÷¶¯Enable£¬²Å»áÔÙ´ÎÉúЧ¡£ÕâÖÖģʽ¿ÉÒÔ¾¡Á¿¼õÉÙµ÷ÊÔ¶¯×÷¶ÔÔËÐÐϵͳµÄÓ°Ïì¡£
È¡¾Ö²¿±äÁ¿×îÔçÊÇÖ±½ÓʹÓÃjdi½Ó¿ÚʵÏֵġ£ÎªÁËÒ»´Î¶Ïµã´¥·¢ÄܸøÓû§Ìṩ×ã¹»µÄÐÅÏ¢£¬»áµÝ¹éµØ½«Ã¿¸ö¾Ö²¿±äÁ¿µÄ³ÉÔ±¶¼È¡³öÀ´¡£µ±ÉèÖÃΪµÝ¹éËIJãµÄʱºò£¬jdiµÄÐÔÄÜÎÊÌⱩ¶Á˳öÀ´£¬¶Ïµã´¥·¢Ö®ºóÍ£¶Ùʱ¼ä³¤´ï¼¸ÃëÖÓ¡£Òò´ËÎÒÃÇÀ©Õ¹ÁËjdwp£¬Ôö¼ÓÁËFSAB£¬Ê¹ÓÃNative·½·¨Ö±½ÓÅúÁ¿»ñÈ¡Êý¾Ý¡£
ÁíÍâÎÒÃÇ»¹ÌṩÁËÁ½Ïî±È½Ï¶ÀÌØµÄ¹¦ÄÜ¡£Ò»¸öÊÇ»ùÓÚwatchpointµ÷ÊÔģʽµÄ¡°¶àÈËÔÚÏßµ÷ÊÔ¡±£¬¼´ZDebugger¿ÉÒÔÈÃÓû§´´½¨»òÕß¶©ÔÄ×Ô¼º¸ÐÐËȤµÄ¶Ïµã£¬µ±¶Ïµã´¥·¢Ê±½«Ïà¹ØÐÅÏ¢ÍÆË͸ø¶©ÔĸöϵãµÄÓû§¡£ÕâÑù¶à¸öÓû§¿ÉÒÔ»¥²»¸ÉÈŵضÔͬһ¸öÔËÐÐϵͳ½øÐе÷ÊÔ¡£ÁíÒ»¸öÊÇ×Ô¶¯¸ú×ÙÓû§¹Ø×¢µÄÊý¾Ý¡£Ê״ζϵ㴥·¢ºó£¬Í¨¹ýFSAB»ñÈ¡¾Ö²¿±äÁ¿³ÉÔ±Êý¾ÝµÄʱºòĬÈÏÊǹã¶È±éÀú¡£×îÖÕÔÚÓû§½çÃæÉϵÄչʾÊÇÒ»¿Å¿ÉÒÔÕ¹¿ªµÄÊ÷£¬Óû§Õ¹¿ªÈ¥²é¿´×Ô¼º¹Ø×¢µÄ³ÉÔ±¡£Õâʱϵͳ»á¼Ç¼ÏÂÓû§¹Ø×¢µÄÊÇÄĸö³ÉÔ±£¬Ï´ζϵ㴥·¢Í¨¹ýFSAB»ñÈ¡Êý¾Ýʱ£¬»á¸ù¾ÝÓû§¹Ø×¢³ÉÔ±µÄ·¾¶½øÐÐÉî¶È±éÀú¡£»ñÈ¡¸ü¶àÓû§¹Ø×¢µÄ·¾¶ÉϵÄÊý¾Ý£¬¶øºöÂÔÆäËû·ÖÖ§¡£
HotMethodProfiling¹ËÃû˼Òå¾ÍÊÇÈȵ㺯ÊýÆÊÎö¡£Èȵ㺯Êýͳ¼ÆÆÊÎöÊÇÐÔÄÜ·ÖÎöÖкÜÖØÒªµÄÒ»Ï×÷¡£ÒòΪ°´ÕÕÒÑÓеľÑ飬³ÌÐòÔËÐйý³ÌÖд󲿷Öʱ¼ä¶¼»¨·ÑÔÚÉÙÁ¿µÄ´úÂëÉÏ¡£ÎªÁËÓÅ»¯¹¤×÷µÄͶÈë²ú³ö±È£¬Ó¦¸ÃÏÈ¿¼ÂÇÓÅ»¯³ÌÐòÖеÄÈȵ㺯Êý¡£
Èȵ㺯Êýͳ¼ÆÓÐÁ½ÖÖ·½·¨£¬Ò»ÖÖÊDzå×®£¬Ò»ÖÖÊDzÉÑù¡£Ç°ÕßµÄÀý×ÓÓÐgprof£¬Í¨¹ý±àÒëʱÔö¼ÓÒ»¸öÌØÊâµÄ±àÒëÑ¡ÏÔÚËùÓк¯ÊýµÄÈë¿ÚºÍ³ö¿Ú²å×®¡£ÔËÐÐʱ£¬ÔÚ×®º¯ÊýÖмǼʱ¼äµÈÐÅÏ¢£¬Êä³öµ½½á¹ûÎļþ¡£Êºó¿ÉÒԵõ½Ã¿¸öº¯Êý¾«È·µÄµ÷ÓôÎÊý¡¢Ö´ÐÐʱ³¤ÒÔ¼°Õû¸öº¯Êýµ÷ÓùØÏµÍ¼¡£ÆäȱµãÊÇÐèÒªÖØÐ±àÒ룬¶øÇÒÒª³ÌÐòÔËÐнáÊøºó²ÅÄÜÄõ½½á¹û¡£ºóÕßµÄÀý×ÓÈçperf£¬Í¨¹ý¸ßƵÂʵĶ¨Ê±ÖжÏÈ¥´ò¶ÏÔËÐÐÖеijÌÐò£¬²¢ÔÚÖжϴ¦ÀíÖмǼµ±Ç°³ÌÐòÔËÐеÄÉÏÏÂÎÄÐÅÏ¢¡£ÕâÑùµÄ½á¹ûÏÔÈ»ÊÇÒ»ÖÖͳ¼ÆÒâÒåÉϵĽá¹û¡£Èç¹û²ÉÑùƵÂʲ»¹»¸ß£¨³öÓÚÐÔÄÜ¿¼ÂÇ£¬Ò»°ãÒ²²»»áÌØ±ð¸ß£©£¬ÓпÉÄܻ᩵ôһЩƵ·±Ö´ÐУ¬µ«Ã¿´ÎÖ´ÐÐʱ¼ä¶ÌÓÚ²ÉÑù¼ä¸ôµÄ´úÂë¡£µ«ÆäÓŵãÊDz»ÓÃÖØ±à³ÌÐò£¬ËæÊ±¶¯Ì¬¿ª¹Ø£¬ÂíÉϾÍÄܵõ½½á¹û¡£
ZProfiler²ÉÓÃÊǺóÒ»ÖÖ·½·¨¡£ÒòΪÔÚÓû§Ì¬³ÌÐòÖУ¬ÎÞ·¨ÏñperfÒ»Ñù²ÉÓÃÓ²¼þÖжϣ¬¶øÊDzÉÓÃÁ˶¨Ê±Ðźţ¨linuxϵͳÌṩÁËÒ»ÖÖSIGPROF¶¨Ê±Æ÷£©¡£ÎÒÃÇÌṩÁËstartºÍstopÁ½¸öjmxÃüÁÆäʵ¾ÍÊÇÆô¶¯ºÍÍ£Ö¹Ò»¸ö¶¨Ê±Æ÷¡£ÔÚ¶¨Ê±Æ÷ÐźŵĴ¦Àíº¯ÊýÖÐÈ¥»ØËÝJavaµ÷ÓÃÕ»¡£
»ØËÝJavaµ÷ÓÃÕ»£¬ZProfilerʹÓÃÁËHotSpotJVMµÄÒ»¸ö·Ç±ê×¼½Ó¿ÚAsyncGetCallTrace£¨¾Ý˵OracleÉÌÒµÈí¼þJavaMissionControlµÄMethodProfilingÒ²ÊÇÓõÄÕâ¸ö½Ó¿Ú£©¡£Í¨¹ýµ÷ÓÃÕâ¸ö½Ó¿Ú¿ÉÒÔ»ñµÃµ±Ç°±»¶¨Ê±Æ÷ÐźŴò¶ÏµÄÏ̵߳ÄJavaµ÷ÓÃÕ»£¬¶ø²»ÐèÒªµÈµ½JVMµÄsafepoint²ÅÄÜÊÕ¼¯Ï̶߳ÑÕ»¡£ÒÀÀµsafepointÀ´ÊÕ¼¯¶ÑÕ»£¨±ÈÈçͨ¹ýµ÷ÓÃThread.getAllStackTraces£©µÄprofiling»úÖÆÊÇÓÐȱÏݵģ¬ÍùÍùÊÕ¼¯µ½µÄÈȵã¶ÑÕ»²¢²»¾«È·¡£ÔÚÔËÐÐJITedµÄ´úÂëÇé¿öÏ£¬safepointµÄʱ»úÍùÍùÊÇÓÉJITÀ´¾ö¶¨µÄ£¬±ÈÈçÔÚÖ´ÐÐһЩ·Ç³£HotµÄÑ»·Ê±£¬ÎªÁ˱£Ö¤Ö´ÐÐЧÂÊ£¬JITÉú³ÉµÄ´úÂë¾Í²»»á²åÈësafepointµÄÂÖѯ¡£ÕâÑùµÄÇé¿öÏ£¬ÒÀÀµsafepointµÄprofiling»úÖÆ¾Í²»»áprofilingµ½ÕâЩÈȵ㡣ÓйØAsyncGetCallTraceµÄʹÓ㬸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔÔÚÍøÉÏÕÒµ½¸ü¶àµÄ×ÊÁÏ£¬»òÕß¿ÉÒÔÖ±½ÓÔĶÁHotSpotµÄÔ´´úÂ룬Àí½âËüµÄÔÀíºÍÓ÷¨¡£
½áÓï
Ïà±ÈÓÚ´«Í³µÄJavaÓ¦ÓõÄProfilingÒÔ¼°µ÷ÊÔ£¬ÔƼÆËã»·¾³ÏßÉÏϵͳÓÐ×ÅÆäÏà¶Ô¶ÀÌØµÄµØ·½£¬ÕýÈçÎÄÕÂÖÐÌáµ½£¬´ÓÄÚ²¿À´Ëµ£¬Äã¿ÉÄÜÐèÒªÓëÔËά´ò½»µÀ£¬¿ÉÄÜÐèÒªÓ벻ͬµÄϵͳ¶Ô½Ó£¬±ÈÈçProfiling/µ÷ÊÔÐèÒªµÄÔ´Âë¾ÍÐèÒªÓëSCM£¨sourcecontrolmanagement£©¶Ô½ÓµÈ£¬ÎÒÃÇÐèÒª°ÑÕâЩ¶¼ÎÞ·ìµØÁ¬½ÓÆðÀ´£¬×ö³ÉһվʽµÄ½â¾ö·½°¸£¬·½±ã¹¥³Çʨ¸ßЧµØ·¢ÏÖ¡¢¶¨Î»¡¢½â¾öÎÊÌ⣬´Ó¶øÌá¸ßÕû¸öµÄÉú²úЧÂÊ¡£¶ø´ÓÍⲿÀ´Ëµ£¬¶ÔÕýÔÚÔËÐеÄϵͳ½øÐÐProfiling/DebuggingÓÖÓÐ×ŷdz£¸ßµÄÐÔÄÜÉϵÄÒªÇ󣬶ԳÌÐòµÄÕý³£ÔËÐеÄÓ°ÏìÒ»¶¨ÒªÔڿɽÓÊܵķ¶Î§ÄÚ£¬ÕâÒ²ÊÇÎÒÃÇΪʲô×öÁËÕâô¶à¶¨ÖƵÄÔÒò¡£Ï£ÍûÎÒÃǵõ½µÄÕâЩ¹Û²ìÌåÑéÒÔ¼°Êµ¼ù¾Ñ飬¶ÔÓÚ¶ÁÕßÔÚÏàËÆµÄ»·¾³Ï£¬Åöµ½ÀàËÆÎÊÌâʱ£¬Äܹ»½è¼øµ½Ò»Ð©½â¾öÎÊÌâµÄ˼·¡£ |