JVM从入门到精通(八):JVM调优实战
案例1:系統CPU經常100%,如何調優?
推理過程是:CPU100%,那么一定有線程在占用系統資源,所以
案例2:系統內存飆高,如何查找問題?
如何監控JVM?
可以使用 jstat jvisualvm jprofiler arthas top…等等
一個案例理解常用工具
java -Xms200M -Xmx200M -XX:+PrintGC com.mashibing.jvm.gc.T15_FullGC_Problem01
一般是運維團隊首先受到報警信息(CPU過高, Memory占比大…然后你才去查原因)
top命令觀察到問題:內存不斷增長 CPU占用率居高不下
top -Hp 觀察進程中的線程,哪個線程CPU和內存占比高
jps定位具體java進程
jstack 定位線程狀況,重點關注:WAITING BLOCKED
e.g.
waiting on <0x0000000088ca3310> (a java.lang.Object)
假如有一個進程中100個線程,很多線程都在waiting on <xx> ,一定要找到是哪個線程持有這把鎖
怎么找?搜索jstack dump的信息,找 ,看哪個線程持有這把鎖RUNNABLE
作業:
1: 寫一個死鎖程序,用jstack觀察
2: 寫一個程序,一個線程持有鎖不釋放,其他線程等待
為什么阿里規范里規定,線程的名稱(尤其是線程池)都要寫有意義的名稱?為了方便定位!
怎么樣自定義線程池里的線程名稱?(自定義ThreadFactory)
jinfo pid了解即可,用處不是特別大
jstat -gc 動態觀察gc情況 / 閱讀GC日志發現頻繁GC / arthas觀察 / jconsole/jvisualVM/ Jprofiler(最好用,收費)
jstat -gc 4655 500 : 每個500個毫秒打印GC的情況
如果面試官問你是怎么定位OOM問題的?如果你回答用圖形界面(錯誤)
1:已經上線的系統不用圖形界面用什么?(cmdline arthas)
2:圖形界面到底用在什么地方?測試!測試的時候進行監控!(壓測觀察)
jmap - histo 4655 | head -20,查找有多少對象產生,這個命令對線上系統影響不大。
jmap -dump:format=b,file=xxx pid手動導出堆文件,這個命令不能線上用。
線上系統,內存特別大,jmap執行期間會對進程產生很大影響,甚至卡頓(電商不適合),你可以這么說:
1:設定了參數HeapDump,OOM的時候會自動產生堆轉儲文件
2:很多服務器備份(高可用),先把這臺機器隔離開,停掉這臺服務器對其他服務器不影響
3:在線定位arthas(一般小點兒公司用不到,這樣吹容易露餡兒)
java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01
使用MAT / jhat /jvisualvm 進行dump文件分析
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
jhat -J-mx512M xxx.dump
http://192.168.17.11:7000
拉到最后:找到對應鏈接
可以使用OQL查找特定問題對象
找到代碼的問題
實戰
top 命令
列出1591進程下的所有線程,重點關注:WAITING BLOCKED
java 日志
總結
以上是生活随笔為你收集整理的JVM从入门到精通(八):JVM调优实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis实战(七):redis的集群:
- 下一篇: MySQL调优(七):滴滴一面二面题,服