qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          輕巧的線程堆棧查看工具Hot Threads

           定位性能問(wèn)題,尤其是cpu使用率過(guò)高時(shí),經(jīng)常需要查找cpu消耗較高的線程,然后查看其堆棧,從而進(jìn)入代碼定位問(wèn)題。
            該場(chǎng)景下, jstack+top是一種非常經(jīng)典的方式。
            jstack+top
            jstack+top的一般套路:
            1、top -H 查看cpu占用較高的線程,記錄十進(jìn)制的線程id
            2、jstack  將線程信息dump到文件中,在文件中根據(jù)線程id查找該線程的堆棧。 注意,jstack輸出中線程id是16進(jìn)制的,這里要做一次進(jìn)制轉(zhuǎn)換。
            3、研究這個(gè)線程的堆棧
            jstack+top方法的不足:
            1、麻煩。由于top工具輸出是實(shí)時(shí)變化的,一般需要抓多次,重復(fù)下來(lái),上述過(guò)程更顯繁瑣。
            2、線程狀態(tài)時(shí)刻變動(dòng),top -H時(shí)看到一個(gè)線程的cpu占用率較高,等到j(luò)stack 時(shí)可能已經(jīng)處于sleep狀態(tài),因此上述操作需要較高的APM
            有什么辦法能省卻這些麻煩 —— 能在看到線程堆棧的時(shí)候,直接看到他們各自的cpu占用率呢? —— Hot Threads 可以!
            Hot Threads
            Hot Threads是一個(gè)小巧的開(kāi)源工具,使用十分容易:
            1、下載jar包,扔到服務(wù)器上
            2、執(zhí)行java -jar HotThread.jar [pid] 即可,pid是被測(cè)的進(jìn)程號(hào)。使用中注意填對(duì)路徑即可。
            Hot Threads的輸出:
            執(zhí)行完上述指令后,Hot Threads會(huì)在很短時(shí)間內(nèi),重復(fù)查詢10次線程堆棧信息(調(diào)用sun.management.ThreadImpl.getThreadInfo方法),統(tǒng)計(jì)平均cpu占用最高的3個(gè)線程,打印線程堆棧,并顯示cpu占用率。
          106.3% CPU Usage by Thread 'Swing-Shell'
          10/10 snapshots sharing following 10 elements
          sun.awt.shell.Win32ShellFolder2.getAttributes0(Native Method)
          sun.awt.shell.Win32ShellFolder2.access$600(Unknown Source)
          sun.awt.shell.Win32ShellFolder2$6.call(Unknown Source)
          sun.awt.shell.Win32ShellFolder2$6.call(Unknown Source)
          java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
          java.util.concurrent.FutureTask.run(Unknown Source)
          java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
          java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
          sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source)
          java.lang.Thread.run(Unknown Source)
          1.6% CPU Usage by Thread 'RMI TCP Connection(9)-172.30.41.210'
          10/10 snapshots sharing following 32 elements
          sun.management.ThreadImpl.getThreadInfo0(Native Method)
          sun.management.ThreadImpl.getThreadInfo(Unknown Source)
          sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
          sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          java.lang.reflect.Method.invoke(Unknown Source)
          com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn(Unknown Source)
          com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)
          com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)
          com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(Unknown Source)
          com.sun.jmx.mbeanserver.PerInterface.invoke(Unknown Source)
          com.sun.jmx.mbeanserver.MBeanSupport.invoke(Unknown Source)
          javax.management.StandardMBean.invoke(Unknown Source)
          com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
          com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
          javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)
          javax.management.remote.rmi.RMIConnectionImpl.access$200(Unknown Source)
          javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)
          javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
          javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)
          sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
          sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          java.lang.reflect.Method.invoke(Unknown Source)
          sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
          sun.rmi.transport.Transport$1.run(Unknown Source)
          java.security.AccessController.doPrivileged(Native Method)
          sun.rmi.transport.Transport.serviceCall(Unknown Source)
          sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
          sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
          sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
          java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
          java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
          java.lang.Thread.run(Unknown Source)
          0.0% CPU Usage by Thread 'Reference Handler'
          10/10 snapshots sharing following 3 elements
          java.lang.Object.wait(Native Method)
          java.lang.Object.wait(Object.java:485)
          java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
            上圖中,每個(gè)線程的能看到 10/10 標(biāo)記。 n / m 意味著m次統(tǒng)計(jì)中,有n次都是該排名。
            Hot Threads使用中的問(wèn)題和解決方法:
            直接執(zhí)行java -jar HotThread.jar [pid]可能會(huì)報(bào)錯(cuò),此時(shí)可以換一種啟動(dòng)方式:
            java -classpath "/opt/jdk1.6/lib/tools.jar:HotThread.jar" hotthread.Main [pid]
            其中 /opt/jdk1.6/lib/tools.jar 是服務(wù)器上jdk tools包的完整路徑,hotthread.Main 是Hot Threads程序的入口。
            Hot Threads的不足:
            使用中發(fā)現(xiàn),Hot Threads自身的cpu開(kāi)銷比較高,有時(shí)候統(tǒng)計(jì)顯示cpu使用率第一的線程,在執(zhí)行的是獲取線程信息的操作,該條堆棧對(duì)分析問(wèn)題無(wú)效。
            2723.0% CPU Usage by Thread 'RMI TCP Connection(4)-192.168.164.87'
            6/10 snapshots sharing following 33 elements
            sun.management.ThreadImpl.getThreadInfo1(Native Method)
            sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:154)
            sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            總結(jié):
            Hot Threads使用快速輕巧, 在需要使用jstack + top的場(chǎng)合,都可以嘗試代替比較繁瑣的jstack + top。

          posted on 2014-05-08 16:07 順其自然EVO 閱讀(1263) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2014年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 枣阳市| 通山县| 马龙县| 宁晋县| 乌兰浩特市| 沙河市| 新巴尔虎左旗| 芜湖市| 乌兰察布市| 忻州市| 元谋县| 孙吴县| 玉溪市| 龙泉市| 江安县| 平谷区| 蕲春县| 读书| 将乐县| 巫山县| 务川| 健康| 汽车| 张家口市| 乐至县| 若羌县| 延长县| 饶阳县| 南皮县| 西乌| 丹棱县| 读书| 安宁市| 炎陵县| 奉化市| 邯郸县| 阳春市| 涿鹿县| 贵港市| 翁牛特旗| 大洼县|