Ò»¡¢¿ª·¢ÕßµÄ×Ô²âÀûÆ÷-HprofÃüÁî 1. ʾÀýÑÝʾ
Àý×Ó³ÌÐò£º
/**
* PROJECT_NAME: test
* DATE: 16/7/22
* CREATE BY: chao.cheng
**/
public class HProfTest {
public void slowMethod() {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
} /**
* PROJECT_NAME: test
* DATE: 16/7/22
* CREATE BY: chao.cheng
**/
public class HProfTest {
public void slowMethod() {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
public void slowerMethod() {
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HProfTest test = new HProfTest();
test.slowerMethod();
test.slowMethod();
}
}
}
public static void main(String[] args) {
HProfTest test = new HProfTest();
test.slowerMethod();
test.slowMethod();
}
}
|
×¢£ºÕâÊÇÒ»¶Î²âÊÔ´úÂëͨ¹ýsleep·½·¨½øÐÐÑÓʱ£¬ÔÚ³ÌÐòÔËÐйý³ÌÖкÜÂý£¬ÎÒÏëÖªµÀµ½µ×ÊÇÄĶγÌÐòÓ°ÏìµÄÕûÌåÐÔÄÜÄØ£¿
ÎÒÔÚÕâ¸öjava³ÌÐòÖУ¬¼ÓÁËÈçÏÂÔËÐвÎÊý£º
-agentlib:hprof=cpu=times,interval=10
/*
times£ºjavaº¯ÊýµÄÖ´ÐÐʱ¼ä
hprof=cpuÊÇÕë¶Ôcpuͳ¼ÆÊ±¼ä
interval=10 ²ÉÑù10´Î
*/ |
ÔÙ´ÎÔËÐÐÕâ¶Î³ÌÐòÏÔʾÈçÏÂͼ£º

Õâʱºò»¹·¢ÏÖÔÚ¹¤³ÌĿ¼ÀïÃæ£¬¶àÁËÒ»¸öÎı¾Îļþjava.hprof.txt£¬ÈçÏÂͼËùʾ£º

ÄÚÈÝÈçÏ£º
CPU TIME (ms) BEGIN (total = 11542) Fri Jul 22 11:00:34 2016
rank self accum count trace method
2 8.66% 95.31% 1 303423 com.test.HProfTest.slowMethod
3 0.25% 95.56% 36 300745 java.util.zip.ZipFile.<init>
4 0.20% 95.76% 36 300434 java.lang.String.equals
5 0.13% 95.89% 14 301138 java.net.URLStreamHandler.parseURL
6 0.11% 96.01% 6 301339 java.net.URLClassLoader$1.run
7 0.10% 96.10% 14 301124 java.lang.String.<init>
8 0.09% 96.19% 3407 300355 java.lang.String.charAt
9 0.08% 96.27% 36 300443 java.io.UnixFileSystem.normalize |
×¢£ºÍ¨¹ýÉÏÃæÄÚÈÝ¿ÉÒÔ¿´µ½£¬ÄĸöÀàµÄ·½·¨Ö´ÐÐʱ¼ä³¤£¬ºÄ·ÑÁËCPUʱ¼ä£¬Ò»Ä¿ÁËÈ»£¬·½±ãÎÒÃÇ¿ìËÙ¶¨Î»ÎÊÌâ¡£
2. ÃüÁîµÄ¾ßÌå½²½â
hprof²»ÊǶÀÁ¢µÄ¼à¿Ø¹¤¾ß£¬ËüÖ»ÊÇÒ»¸öjava agent¹¤¾ß£¬Ëü¿ÉÒÔÓÃÔÚ¼à¿ØJavaÓ¦ÓóÌÐòÔÚÔËÐÐʱµÄCPUÐÅÏ¢ºÍ¶ÑÄÚÈÝ£¬Ê¹ÓÃjava -agentlib:hprof=helpÃüÁî¿ÉÒԲ鿴hprofµÄʹÓÃÎĵµ¡£

ͨ¹ýÉÏͼ¿ÉÒÔ¿´µ½Õâ¸ö¹¤¾ß·Ç³£Ç¿´ó£¬¿ÉÒÔͳ¼ÆµÄ¶«Î÷ºÜ¶à£¬ÉÏÃæµÄÀý×Óͳ¼ÆµÄÊÇCPUʱ¼ä£¬Í¬ÑùÎÒÃÇ»¹¿ÉÒÔͳ¼ÆÄÚ´æÕ¼ÓõÄdumpÐÅÏ¢¡£
È磺-agentlib:hprof=heap,format=b,file=/test.hprof
Õâ¸öhprofС¹¤¾ß£¬·Ç³£·½±ãÎÒÃÇÔÚÓÃJUnit×Ô²â´úÂëµÄʱºò½áºÏʹÓ㬼ȿÉÒÔ½â¾öÒµÎñÉϵÄBUG£¬ÓÖÄܹ»ÔÚÒ»¶¨³ÌÐòÉϽâ¾ö¿É·¢ÏÖµÄÐÔÄÜÎÊÌ⣬·Ç³£ÊµÓá£
¶þ¡¢ÐÔÄÜÅŲ鹤¾ß-pidstat 1. ʾÀýÑÝʾ Àý×Ó³ÌÐò£º
/**
* PROJECT_NAME: test
* DATE: 16/7/22
* CREATE BY: chao.cheng
**/
public class PidstatTest {
public static class PidstatTask implements Runnable {
public void run() {
while(true) {
double value = Math.random() * Math.random();
}
}
}
public static class LazyTask implements Runnable {
public void run() {
try {
while (true) {
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new PidstatTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
}
} |
×¢£ºÕâÊÇÒ»¶Î²âÊÔÓõÄjava³ÌÐò£¬½«ÆäÔËÐÐÆðÀ´¡£ ÔÚÃüÁîÐÐÊäÈ룺
pidstat -p 843 1 3 -u -t
/*
-u£º´ú±í¶ÔcpuʹÓÃÂÊµÄ¼à¿Ø
²ÎÊý1 3£º±íʾÿÃë²ÉÑùÒ»´Î£¬Ò»¹²Èý´Î
-t£º½«¼à¿Ø¼¶±ðϸ»¯µ½Ïß³Ì
*/ |
ÔËÐÐÃüÁîÏÔʾÈçÏÂͼËùʾ£º

×¢£ºÆäʵÖÐTID¾ÍÊÇÏß³ÌID£¬%usr±íʾÓû§Ïß³ÌʹÓÃÂÊ£¬´ÓͼÖпÉÒÔ¿´µ½855Õâ¸öÏß³ÌCPUÕ¼Ó÷dz£¸ß¡£
ÔÙÊäÈëÈçÏÂÃüÁ
jstack -l 843 > /tmp/testlog.txt |
²é¿´testlog.txtÏÔʾÈçϲ¿·ÖÄÚÈÝ£º

×¢£ºÎÒÃǹØ×¢µÄÊÇÈÕÖ¾ÎļþµÄNID×ֶΣ¬Ëü¶ÔÓ¦µÄ¾ÍÊÇÎÒÃÇÉÏÃæËµµÄTID£¬NIDÊÇTIDµÄ16½øÖƱíʾ£¬½«ÉÏÃæµÄÊ®½øÖÆ855ת»»³ÉÊ®Áù½øÖÆÎª357£¬ÔÚÈÕÖ¾ÖнøÐÐËÑË÷¿´µ½ÈçÏÂÄÚÈÝ£º
"Thread-0" prio=10 tid=0x00007f7d90103800 nid=0x357 runnable [0x00007f7d943d5000]
java.lang.Thread.State: RUNNABLE
at PidstatTest$PidstatTask.run(PidstatTest.java:13)
at java.lang.Thread.run(Thread.java:722)
Locked ownable synchronizers:
- None
|
ÒÔ´Ë¿ÉÒÔÍÆ¶Ï³öÓÐÐÔÄÜÆ¿¾±µÄ³ÌÐòµã¡£
2. pidstat¾ßÌåÃüÁîÏê½â
pidstatÊÇÒ»¸ö¹¦Äܷdz£Ç¿´óµÄÐÔÄܼà²â¹¤¾ß£¬ËûÊÇSysstatµÄ×é¼þÖ®Ò»£¬¿ÉÒÔ´Óhttp://sebastien.godard.pagesperso-orange.fr/download.html ½øÐÐÏÂÔØ£¬ÏÂÔØºó¿ÉÒÔͨ¹ý./configureµÈÃüÁî½øÐа²×°£¬Õâ¸öÃüÁîµÄÇ¿´óÖ®´¦ÔÚÓÚ²»½ö¿ÉÒÔ¼à¿Ø½ø³ÌµÄÐÔÄÜÇé¿ö£¬Ò²¿ÉÒÔ¼à¿ØÏ̵߳ÄÐÔÄÜÇé¿ö¡£
pidstat¼à¿ØCPU³£ÓÃÏÔʾ×Ö¶ÎÄÚÈÝÈçÏ£º
1¡¢PID - ±»¼à¿ØµÄÈÎÎñµÄ½ø³ÌºÅ
2¡¢%usr - µ±ÔÚÓû§²ãÖ´ÐУ¨Ó¦ÓóÌÐò£©Ê±Õâ¸öÈÎÎñµÄcpuʹÓÃÂÊ£¬ºÍ nice ÓÅÏȼ¶Î޹ء£×¢ÒâÕâ¸ö×ֶμÆËãµÄcpuʱ¼ä²»°üÀ¨ÔÚÐéÄâ´¦ÀíÆ÷Öл¨È¥µÄʱ¼ä¡£
3¡¢%system - Õâ¸öÈÎÎñÔÚϵͳ²ãʹÓÃʱµÄcpuʹÓÃÂÊ¡£
4¡¢%guest - ÈÎÎñ»¨·ÑÔÚÐéÄâ»úÉϵÄcpuʹÓÃÂÊ£¨ÔËÐÐÔÚÐéÄâ´¦ÀíÆ÷£©¡£
5¡¢%CPU - ÈÎÎñ×ܵÄcpuʹÓÃÂÊ¡£ÔÚSMP»·¾³£¨¶à´¦ÀíÆ÷£©ÖУ¬Èç¹ûÔÚÃüÁîÐÐÖÐÊäÈë-I²ÎÊýµÄ»°£¬cpuʹÓÃÂÊ»á³ýÒÔÄãµÄcpuÊýÁ¿¡£
6¡¢CPU - ÕýÔÚÔËÐÐÕâ¸öÈÎÎñµÄ´¦ÀíÆ÷±àºÅ¡£
7¡¢Command - Õâ¸öÈÎÎñµÄÃüÁîÃû³Æ¡£ pidstat¼à¿ØIO³£ÓõÄ×Ö¶ÎÏÔʾÄÚÈÝÈçÏ£º 1¡¢kB_rd/s - ÈÎÎñ´ÓÓ²ÅÌÉϵĶÁÈ¡ËÙ¶È£¨kb£©
2¡¢kB_wr/s - ÈÎÎñÏòÓ²ÅÌÖеÄдÈëËÙ¶È£¨kb£©
3¡¢kB_ccwr/s - ÈÎÎñдÈë´ÅÅ̱»È¡ÏûµÄËÙÂÊ£¨kb£©
Èý¡¢Ò»¸öÄÚ´æÒç³ö°¸Àý·ÖÎö
1. ÄÚ´æÒç³öÏÖÏó
ϵͳ¹²ÓÐ8̨·þÎñÆ÷£¬Ã¿´ÎËæ»úÖ»ÓÐһ̨·þÎñÆ÷±¨java.lang.OutOfMemoryError: GC overhead limit exceeded´íÎó£¬È»ºó½Óמͱ¨ÄÚ´æÒç³ö´íÎójava.lang.OutOfMemoryError: Java heap space¡£
2. ÀíÂÛÖ§³Å
ÎÒÃÇÏȽâÊÍÒ»ÏÂʲôÊÇGC overhead limit exceeded´íÎó¡£
GC overhead limt exceed¼ì²éÊÇHotspot VM 1.6¶¨ÒåµÄÒ»¸ö²ßÂÔ£¬Í¨¹ýͳ¼ÆGCʱ¼äÀ´Ô¤²âÊÇ·ñÒªOOMÁË£¬ÌáǰÅ׳öÒì³££¬·ÀÖ¹OOM·¢Éú¡£Sun ¹Ù·½¶Ô´ËµÄ¶¨ÒåÊÇ£º¡°²¢ÐÐ/²¢·¢»ØÊÕÆ÷ÔÚGC»ØÊÕʱ¼ä¹ý³¤Ê±»áÅ׳öOutOfMemroyError¡£¹ý³¤µÄ¶¨ÒåÊÇ£¬³¬¹ý98%µÄʱ¼äÓÃÀ´×öGC²¢ÇÒ»ØÊÕÁ˲»µ½2%µÄ¶ÑÄÚ´æ¡£ÓÃÀ´±ÜÃâÄÚ´æ¹ýСÔì³ÉÓ¦Óò»ÄÜÕý³£¹¤×÷¡£
¿ÉÒÔ¿´µ½µ±¶ÑÖеĶÔÏóÎÞ·¨±»ÊջصÄʱºò£¬¾ÍÌáǰÓö¾¯±¨³öÕâÑùµÄ´íÎ󣬴ËʱÄڴ沢ûÓÐÒç³ö£¬Õâ¸öÌØÐÔÔÚJDKÖÐÊÇĬÈÏÌí¼ÓµÄ¡£
3. DUMPÎļþ·ÖÎö
½«dumpÎļþµ¼ÈëVisualVM¹¤¾ßÖУ¬ÈçÏÂͼËùʾ£º

ͨ¹ýÉÏͼ¿ÉÒÔ¿´³öÀà½á¹¹Í¼ÖУ¬×îÕ¼ÓÃÄÚ´æµÄÊÇchar[]£¬LinkedHashMapºÍStringÈýÏî¡£µ«ÊÇÕâÈýÏîµÄʵÀýÊý²¢Ã»ÓÐÕ¼Âú£¬¿´Ñù×Ó²»»áÄÚ´æÒç³ö£¬Ôõô²ÅÄܾßÌå·ÖÎöÄØ£¿ÔÒò¾ÍÔÚÓÚGC overhead limt exceed£¬Õâ¸ö´í²¢²»»áÔÚÄÚ´æÕæÕýÒç³ö²Å»á±¨£¬ËùÒÔͨ¹ýdumpÎļþ£¬ÎÒÃÇÖ»ÄÜ×Ô¼ºÈ¥ÅжϷÖÎö£¬ÄÄЩÏîÓпÉÄÜ»áÔì³ÉÒç³ö£¬ÎÒÃǽøÈëchar[]Ïî¾ßÌåÀ´¿´£¬»á·¢ÏÖÀïÃæÓкܶàhessianµÄurl×Ö·û±»»º´æ£¬Í¨¹ýÅųý³ÌÐò¿ÉÒÔ¿´µ½ÓÉÓڵײãÖмä¼þ³ÌÐòΪÁËÌá¸ß¡°ÐÔÄÜ¡±£¬½«Ã¿´Îµ÷ÓõÄurl¶¼»º´æÆðÀ´£¬²»ÓÃÿ´Î¶¼Éú³É£¬µ«Ã»ÓÐÏàÓ¦»º´æÊͷŲÙ×÷£¬ÓÚÊÇÔì³ÉÁË´óÁ¿×Ö·û¶ÔÏó³¤ÆÚ³ÖÓдӶø±¨´í£¬Ôڴ˾Ͳ»½ØÍ¼À´¾ßÌå¿´´úÂë£¬Éæ¼°Ò»Ð©¹«Ë¾ÐÅÏ¢¡£
4. ÎÊÌâ½â¾ö·½°¸
¿ÉÒÔÌí¼ÓJVMµÄÆô¶¯²ÎÊýÀ´È¥µôÌáǰ±¨¾¯ÏÞÖÆ£º-XX:-UseGCOverheadLimit£¬ÓÚÆäÈÃÓ¦ÓÃÿ´Î¶¼Ìáǰ±¨¾¯£¬»¹²»ÈçÈñ©·çÓêÀ´µÄ¸üÃÍЩ£¬Ö±½ÓÄÚ´æÒç³ö£¬ÒòΪ·þÎñÆ÷ÊǼ¯Èº£¬ÆäÖÐһ̨¹Òµô²»»áÓ°ÏìÏßÉÏÕý³£½»Ò×£¬Í¬Ê±Ò²·½±ãÎÒÃÇͨ¹ýÈÕÖ¾À´ÅÅ´í¡£
ͨ¹ýÅŲé³ÌÐò£¬¼ì²éϵͳÊÇ·ñÓÐʹÓôóÄÚ´æµÄ´úÂë²»ÊÍ·Å»òËÀÑ»·¡£
|