真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java線上問(wèn)題排查套路是什么

這篇文章給大家介紹java線上問(wèn)題排查套路是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

成都創(chuàng)新互聯(lián)公司咨詢電話:028-86922220,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),成都創(chuàng)新互聯(lián)公司網(wǎng)頁(yè)制作領(lǐng)域十多年,包括門(mén)窗定制等多個(gè)方面擁有豐富的網(wǎng)站維護(hù)經(jīng)驗(yàn),選擇成都創(chuàng)新互聯(lián)公司,為網(wǎng)站錦上添花!

tags: java, troubleshooting, monitor


一句話概括:java應(yīng)用線上問(wèn)題如CPU過(guò)高,內(nèi)存溢出,IO過(guò)高等問(wèn)題如何排查,本文為你詳細(xì)講述。

1 引言

java應(yīng)用上線運(yùn)行后,免不了會(huì)有各種問(wèn)題,總的來(lái)說(shuō)問(wèn)題會(huì)分為四大類(lèi):

  • (1)CPU相關(guān)問(wèn)題

  • (2)內(nèi)存相關(guān)問(wèn)題

  • (3)磁盤(pán)及IO相關(guān)問(wèn)題

  • (4)業(yè)務(wù)代碼問(wèn)題。

針對(duì)這些問(wèn)題,線上如何進(jìn)行監(jiān)測(cè)與問(wèn)題排查,是一個(gè)java開(kāi)發(fā)人員的必要技能。下面將結(jié)合前面提到的java命令行工具,對(duì)這幾個(gè)問(wèn)題的排查套路進(jìn)行說(shuō)明。

2 CPU問(wèn)題排查套路

如果發(fā)現(xiàn)系統(tǒng)變慢變卡,應(yīng)用響應(yīng)變慢,首先要查的就是CPU使用情況,一般是進(jìn)程占用CPU過(guò)高,因此需要監(jiān)測(cè)CPU的占用情況,而java應(yīng)用中與CPU相關(guān)的主要是線程的運(yùn)行,因此具體到j(luò)ava應(yīng)用,需要監(jiān)測(cè)線程的運(yùn)行狀態(tài),對(duì)應(yīng)就是命令行工具jstack。因此,總結(jié)CPU占用過(guò)高問(wèn)題可按下面套路:

# (1) 查詢CPU占用高的進(jìn)程ID(PID)
top -c

# (2) 了解此進(jìn)程的啟動(dòng)參數(shù)
ps -ef|grep  PID
或者
jinfo -flags PID

# (3) 打印線程堆棧信息并輸出文件
jstack -l PID > PID.dump

# (4) 根據(jù)進(jìn)程查找線程ID(TID)
top -H -p PID

# (5) 獲取TID的16進(jìn)制數(shù)
printf "%x\n" TID

# (6) 結(jié)合TID和線程堆棧信息文件查找問(wèn)題
- 可以使用文本工具直接查看
- 可以使用 grep TID -A20 PID.dump 來(lái)查看
- 需要配合線程狀態(tài)來(lái)檢查

關(guān)于jstack工具和線程狀態(tài)可查看文章《java應(yīng)用監(jiān)測(cè)(3)-這些命令行工具你掌握了嗎》

3 內(nèi)存問(wèn)題排查套路

內(nèi)存問(wèn)題主要是java應(yīng)用在運(yùn)行過(guò)程中發(fā)生OOM(out of memory),因此需要建議在java應(yīng)用啟動(dòng)時(shí),添加幾個(gè)參數(shù),包括-Xloggc:file -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof -XX:ErrorFile=logs/java_error_%p.log。這樣當(dāng)發(fā)生oom時(shí),可以從dump出來(lái)的文件來(lái)分析oom的原因。與內(nèi)存問(wèn)題相關(guān)的java命令行工具包括jmap,jstat,因此內(nèi)存OOM問(wèn)題排查套路如下:

# (1)找到j(luò)ava應(yīng)用進(jìn)程(PID)
jps -lvm
或者
top -c

# (2)了解此進(jìn)程啟動(dòng)參數(shù)(特別是-Xms,-Xmx等)
ps -ef|grep  PID
或者
jinfo -flags PID

# (3) 確認(rèn)內(nèi)存情況
jmap -heap PID

# (4) 查找占內(nèi)存的大對(duì)象
jmap -histo:live PID 

# (5) dump出堆文件,以便使用工具分析
jmap -dump:file=./heap.hprof PID

# (6) 查看GC變化情況,如下每秒打印一次
jstat -gc PID 1000 

# (7) 結(jié)合日志文件出錯(cuò)信息及dump出來(lái)的堆文件分析OOM和GC情況
- 內(nèi)存分配小,適當(dāng)調(diào)整內(nèi)存
- 對(duì)象被頻繁創(chuàng)建,且不釋放,優(yōu)化代碼
- young gc頻率太高,查看-Xmn、-XX:SurvivorRatio等參數(shù)設(shè)置是否合理

關(guān)于OOM,官方文檔有關(guān)于OOM的說(shuō)明(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html), 主要分為以下幾大類(lèi):

  • java.lang.OutOfMemoryError: Java heap space,堆的內(nèi)存占用已經(jīng)達(dá)到-Xmx設(shè)置的最大值,無(wú)法創(chuàng)建新對(duì)象,簡(jiǎn)單的可以考慮通過(guò)調(diào)整-Xmx參數(shù)來(lái)解決。

  • java.lang.OutOfMemoryError: GC Overhead limit exceeded,表示GC一直在執(zhí)行且java進(jìn)程運(yùn)行很慢,通常會(huì)拋出此異常,java堆的分配的空間很小以至于新數(shù)據(jù)無(wú)法放到堆中??紤]調(diào)整堆大小,如果想關(guān)閉此輸出,可用參數(shù)來(lái)關(guān)閉-XX:-UseGCOverheadLimit。

  • java.lang.OutOfMemoryError: Requested array size exceeds VM limit,java應(yīng)用嘗試分配大于堆大小的數(shù)組,如堆大小是256M,卻要分配512M的數(shù)組,則會(huì)報(bào)錯(cuò)??紤]調(diào)整堆大小或者修改代碼

  • java.lang.OutOfMemoryError: Metaspace,當(dāng)類(lèi)元數(shù)據(jù)所需的本機(jī)內(nèi)存量超過(guò)時(shí)MaxMetaSpaceSize時(shí)報(bào)出,考慮調(diào)整MaxMetaSpaceSize。

  • java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?當(dāng)來(lái)自本機(jī)堆的分配失敗并且本機(jī)堆可能接近耗盡時(shí)會(huì)報(bào)此錯(cuò)誤,需要查看日志來(lái)處理。

  • java.lang.OutOfMemoryError: Compressed class space,JVM的非堆結(jié)構(gòu)中,類(lèi)指針存放空間不足,考慮使用CompressedClassSpaceSize來(lái)調(diào)整。

  • java.lang.OutOfMemoryError: reason stack_trace_with_native_method,JVM的本地方法區(qū)不足,在Java本機(jī)接口(JNI)或本機(jī)方法中檢測(cè)到分配失敗,需要查找對(duì)應(yīng)堆棧信息來(lái)查詢。

4 磁盤(pán)及IO問(wèn)題排查套路

java應(yīng)用運(yùn)行過(guò)程中,會(huì)涉及日志產(chǎn)生,對(duì)磁盤(pán)的讀寫(xiě)等操作,也有可能有各種問(wèn)題,如磁盤(pán)不足(日志輸出過(guò)多)、、磁盤(pán)讀寫(xiě)IO比較慢、IO過(guò)于頻繁等。一般來(lái)說(shuō),可以按以下套路進(jìn)行排查:

# (1) 查看磁盤(pán)容量情況
df -h

# (2) 查看文件大小和目錄大小
ls -l 或者直接ll
du -h --max-depth=1

# (3) 查看IO情況,找到IO讀寫(xiě)頻繁的進(jìn)程PID
iotop -d 1 # 1秒打印一次
或者
iostat -d -x -k 1 #1秒打印一次

# (4) 使用stack打印線程堆棧信息,排查IO相關(guān)代碼

# (5) 有時(shí)候若想測(cè)試磁盤(pán)的讀寫(xiě)速度(特別是虛擬機(jī)),可以使用dd
# 示例:測(cè)數(shù)據(jù)卷掛載目錄的純寫(xiě)速度
dd if=/dev/zero of=/數(shù)據(jù)卷目錄/test.iso bs=8k count=1000000

5 業(yè)務(wù)問(wèn)題排查套路

業(yè)務(wù)問(wèn)題,主要是涉及到代碼邏輯層面的,主要是查詢?nèi)罩据敵?,方法是否按正確的邏輯執(zhí)行,因此一般的排查套路如下:

# (1) 實(shí)時(shí)日志輸出查詢
tail -fn 100 log_file

# (2) 根據(jù)日志輸出的關(guān)鍵字來(lái)定位問(wèn)題
grep keyWord log_file # 關(guān)鍵字所在行
grep -C n keyWord log_file # 關(guān)鍵字所在前后n行

# (3) 日志文件使用可視化文本工具分析(notepad++,sublime,大文件查看如EmEditor)

# (4) 使用線上工具直接檢測(cè)方法的參數(shù)、返回值,異常情況等等,如Btrace,arthas等。

結(jié)合java的命令行工具和線上診斷工具,可以很方便地給java應(yīng)用進(jìn)行排查。

關(guān)于java線上問(wèn)題排查套路是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


當(dāng)前題目:java線上問(wèn)題排查套路是什么
標(biāo)題來(lái)源:http://weahome.cn/article/ijgejs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部