Java程序問題 和MySQL 數據庫的性能問題解決思路

解決問題思路
Java程序問題(運行慢)
先經過 top 查看整個CPU資源使用狀況;
經過top -Hp pid查看java進程的每個線程佔用CPU的狀況;
若是有一個線程佔用CPU太高,有兩種可能:
沒有內存了,Java垃圾回收線程不停地運行嘗試回收內存,可是每次沒法收回,確認:
jstat -gcutil pid 1s   觀察10多秒鐘就能發現了,看是否是內存使用率接近100%了
相似於死循環(hash衝突***),就是一個線程一直佔用一個核的全部CPU資源(其實一個線程老是暫用一個核超過50%的資源都是不太正常的),解決:
用我課堂的checkPerf腳本,定位這個線程具體執行的任務(能具體到某一行),對應看代碼解決。
若是有不少線程,每一個線程佔用的CPU都很少,那基本是正常的。
若是死鎖:
jstack -l pid 多執行幾回,統計一下stack中老是在等待哪些鎖,能夠對鎖id進行排序統計(sort uniq grep)
上面列出來的都是明顯的瓶頸,最可怕的是哪裏都沒有明顯的瓶頸,哪裏都要偷一點點資源走,這是能夠試試JProfiler這樣更專業一點的工具,同時要配合本身對業務的瞭解來解決。
Java內存的問題,若是有內存泄露(就是執行完fgc/old gc後不能回收的內存不斷地增長):
快速解決:jmap -histo:live pid  來統計全部對象的個數(String/char/Integer/HashEntry 這樣的對象不少很正常,主要是盯着大家公司的包名下的那些對象)
每隔一分鐘執行一次上面的命令,執行5次以上,看看大家公司報名下的對象數量哪一個在一直增長,那基本上就是這個對象引發了泄露;
用課堂上的工具HouseMD來動態監控建立這個對象的地方(通常來講不少時候建立了這些對象把他們丟到一個HashMap而後就無論了),分析一下有沒有釋放!
上面的方法實在無法定位就用: jmap -dump 導出整個內存(耗時間,須要很大的內存的機器才能對這個導出文件進行分析,會將JVM鎖住一段時間)
在Eclipse的插件EMA中打開這個文件(2G的物理文件須要4G以上的內存,5G以上的須要將近20G的內存來分析了)
盯着大家公司報名的那些對象,看看引用關係,誰拿着這些對象沒釋放(是不是必要的)
MySQL 數據庫的性能問題
大部分狀況下是磁盤IO的問題(索引沒建好、查詢太複雜);
索引問題的話分析慢查詢日誌,explain 他們挨個解決。
偶爾也有數據庫CPU不夠的狀況,若是併發高CPU不夠很正常,若是併發不高,那極可能就是group by/order by/random之類的操做嚴重消耗了數據庫的CPU
mysql -e "show full processlist" | grep -v Sleep | sort -rnk6 查看那些SQL語句執行的太長
拿出這個SQL語句分析他們的執行計劃: explain SQL 而後改進;
分析慢查詢日誌,統計top10性能殺手的語句,挨個explain他們,而後改進(具體改進辦法具體分析,這裏只談思路)
總結一下數據庫問題就只有這三招:show full processlist/分析慢查詢日誌/explain(而後建好聯合索引)
相關文章
相關標籤/搜索