這篇文章主要介紹“分析Java生產環境下問題排查思路”,在日常操作中,相信很多人在分析Java生產環境下問題排查思路問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分析Java生產環境下問題排查思路”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在峨眉山等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供成都網站設計、網站建設、外貿網站建設 網站設計制作按需策劃,公司網站建設,企業網站建設,品牌網站設計,全網營銷推廣,成都外貿網站建設,峨眉山網站建設費用合理。
Java生產環境下問題排查
在生產環境中,我們無法通過斷點調試、新增log、可視化工具去立馬查看當前的運行狀態和拿到錯誤信息,此時,借助Java自帶的命令行工具以及相關dump分析工具以及一些小技巧,可以大大提升我們排查問題的效率。
運行參數
下面會列出一些常用且非常有效的命令以及參數來查看運行時Java程序的信息,從而輔助你了解程序運行狀態。
查看JVM參數
jps -l 查看所有正在運行的Java程序,同時顯示啟動類類名,獲取到PID。
4706 org.apache.catalina.startup.Bootstrap
5023 sun.tools.jps.Jps
jinfo -flags PID 查看運行時進程參數與JVM參數
Attaching to process ID 28987, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=132120576 -XX:MaxHeapSize=2092957696 -XX:MaxNewSize=697303040 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44040192 -XX:OldSize=88080384 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -Dspring.config.location=application.properties -Dspring.profiles.active=staging
java -XX:+PrintFlagsFinal -version 查看當前虛擬機默認JVM參數
查看即時GC狀態
jstat -gc PID 1000 10 每秒查看一次gc信息,共10次,輸出比較多的參數。
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 15.3 0.0 4416.0 1055.2 11372.0 7572.5 14720.0 14322.5 1664.0 1522.8 40 0.137 8 0.039 0.176
期間可能碰到提示sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.181-b01. Target VM is 25.171-b11的問題,原因在于安裝了多個版本,使用which、ls -l可簡介定位到與當前執行Java程序相同的Java版本。
錯誤排查
內存問題
內存泄露導致OOM?內存占用異常的高?這是生產環境常常出現的問題,Java提供dump文件供我們對內存里發生過的事情進行了記錄,我們需要借助一些工具從中獲取有價值的信息。
導出Dump文件
提前對Java程序加上這些參數印dump文件 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
對正在運行的程序使用jmap:jmap -dump:format=b,file=heap.hprof PID
分析Dump文件
如果Dump文件不太大的話,可以傳到指定渠道來分析。文件比較大,且想進行更加系統的分析,推薦使用MAT分析,有如下幾種常用查看方式:
首頁中的【Leak Suspects】能推測出問題所在;
點擊【Create a histogram from an arbitrary set of objects】查到所有對象的數量;
右鍵點擊某個對象【Merge Shortest Paths to GC Roots】-> 【exclude all phantom/weak/soft etc. references】能查詢到大量數量的某個對象是哪個GC ROOT引用的。
線程問題
任務長時間不退出?CPU 負載過高?很可能因為死循環或者死鎖,導致某些線程一直執行不被中斷,但是不報錯是最煩人的,所以日志里看不到錯誤信息,并且又不能用dump文件分析,因為跟內存無關。這個時候就需要用線程分析工具來幫我們了。
導出jstack文件
使用jstack PID > 文件,如果失敗請加-F參數,如果還失敗請使用Java程序啟動時使用的用戶執行jstack,下面是jstack的部分輸出格式:
線程名 PID的16進制
"http-nio-8080-Acceptor-0" #17 daemon prio=5 os_prio=0 tid=0x00007fac2c4bd000 nid=0x29f4 runnable [0x00007fac192f6000]
java.lang.Thread.State: RUNNABLE(tomcat的工作線程正在運行,有NEW/RUNNABLE/BLOCKED/WAITING/TIMED_WATING/TERMINATED狀態)
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
- locked<0x00000000faf845a8>(a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:682)
at java.lang.Thread.run(Thread.java:748)
jstack的輸出可以看到所有的線程以及他們的狀態,我們就可以看有哪些我們自己創建的正在運行的線程,那很可能就是那個一直在執行的線程了,此時線程名就格外重要了,所以建議創建新線程時指定有意義的線程名。當然,通過PID查找也非常方便。
到此,關于“分析Java生產環境下問題排查思路”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!
本文名稱:分析Java生產環境下問題排查思路
文章網址:http://vcdvsql.cn/article22/jhjicc.html
成都網站建設公司_創新互聯,為您提供建站公司、網站維護、用戶體驗、Google、定制開發、App設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯