Java排查问题随笔
常言道:“好記性不如爛筆頭”,確實很有道理。在日常工作中,偶爾處理下線上問題還是很常見的,經常出現的情況就是忘記一些常用命令(套路)的用法了,因此整理下來非常用必要,以便關鍵時刻可以節省到處搜索的時間。
常用Linux命令
1. top命令,直觀查看機器資源使用情況。
(1)top -Hp PID 查看指定進程具體線程、內存使用情況 (2)輸入top后,按P以CPU 占用率大小的順序排列進程列表 (3)輸入top后,按M以內存占用率大小的順序排列進程列表?
2. free命令,這個命令估計大家也肯定經常用, 但是命令結果每行每列具體含義,經常容易忘記。
1)先看第一行
total used free shared buffers cached
Mem:? ? ? ? ? 7804 ? ? ? 7643? ? ? ? 161? ? ? ? 153? ? ? ? 333 ? ? ? 2658
機器總的總內存(total)為7804MB、其中使用了(used)7643MB、還剩下(free)161MB未使用,這幾個指標應該是最好理解的。
另外某部分內存是可以共享的,比如程序代碼片段可以被多個進程共享,這部分就是shared指標的含義了,也就是說有153MB內存被用于做共享內存了。
重點說下buffers和cached兩個指標,這2個指標所占用的內存都是Linux為了提高訪問性能而用來做高速緩存的,查了下資料有說cache是用于文件系統緩存,buffer是用于塊設備緩存,還有的書籍說內核2.2以后cache和buffer整合成了一個"通用數據塊層",想要深究只能自行查詢更官方的文檔了。簡而言之,這部分內存是Linux內核自行維護的,不需要我們關心,正因為有了這些高速緩存,linux才不需要頻繁IO操作,性能才得以提高。
2)第二行
-/+ buffers/cache: ? ? ? 4651 ? ? ? 3153
這行的含義經常容易搞混。其實它想表達的是如果系統禁用buffer和cache高速緩存,那么系統實際就只使用了4651MB內存,還剩余3153MB內存。換個說法,就是第一行的
used = 實際使用的內存 + buggers/cache的內存, 而第一行的free= total - used。
3)第三行
Swap:? ? ? ? 30517? ? ? ? 231? ? ? 30286
這行的數據表示交換空間的總量、使用量、和剩余量。由于交換空間是在內存不足的情況下,使用磁盤當內存用,所以這行如果出現了使用量比較多的情況,那就真的事內存不夠,要好好檢查下是不是有什么內存泄漏了。
?
4)總結下
實際上判斷內存使用情況,直接看第二行就行了,這行是系統程序實際使用的內存情況,而對于buffer和cache完全是由內核去控制的,應該是不建議我們去干預的。另外如果第三行數據有異常,就該認真排查了。
?
查看JVM堆棧命令
1. jmap?
1)jmap -dump:file=hprof-jvm.bin -F PID 轉存jvm堆棧信息文件獲取到堆棧信息的二進制文件后,可以使用Eclipse的MAT去分析是否存在異常情況,MAT這個東西確實好用,而且能幫我們自動分析去一些異常,比如內存泄漏什么的。附上下載地址 http://www.eclipse.org/mat/。
2)jmap -histo PID 獲取每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數(-histo:live )加上后,只統計活的對象數量.
2.jstack -l PID >> jstack.data。打印活動線程信息
?
查看GC日志
目前接觸項目都是CMS比較多(不知道是不是我們公司比較土~~),GC日志打印內容非常多,第一次看的話確實是懵。了解 CMS 垃圾回收日志,里面有比較清晰說明。這里我只摘錄查閱資料后幾點個作為筆記。
1)我們的CMS full gc時,經常會看到如下信息:CMS: abort preclean due to time, 這個問題有篇文章講的很透徹:https://blogs.oracle.com/jonthecollector/entry/did_you_know。主要的意思是:preclean是為了加速下一級的remark過程,因為remark過程是STW的。preclean過程中為了更好的使用parallel,它會等待一次小gc(默認等待5s),如果5s內小gc沒來,就會強制開始STW remark過程,并打印信息abort preclean due to time。就是說,出現這個log實際上關系不大,除非我們發現remark過程耗時過久。2)13901.282: [GC 13901.283: [ParNew: 8766574K->400883K(9216000K), 1.9300940 secs] 10239467K->1917256K(11578944K), 1.9309390 secs] [Times: user=13.68 sys=0.07, real=1.93 secs]
這段ParNew GC日志最后有三個時間[Times: user=13.68 sys=0.07, real=1.93 secs]含義是指user是用戶態花費的時間,sys是內核態花費的時間,而real是實際花費的時間,user+sys是CPU時間,每個CPU core單獨計算,所以這個時間可能會是real的好幾倍。
?
參考鏈接
linux top命令中的cache & buffers
Linux Top 命令解析 比較詳細
關于CMS: abort preclean due to time
通過 jstack 與 jmap 分析一次線上故障
? ?了解 CMS 垃圾回收日志
?
轉載于:https://www.cnblogs.com/yipaihushuo/p/9901704.html
總結
以上是生活随笔為你收集整理的Java排查问题随笔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows安装mysql8.0
- 下一篇: 基于Java JAAS表单的身份验证