java程序 cpu load過高分析過程
1\ jps -v列出所有的java程序 , top找出cpu佔用過高的對應的java 程序pid
2\ 使用top -H -p PID 命令檢視對應程序裡的哪個執行緒佔用CPU過高,取該執行緒pid
3\ 將執行緒的pid 轉成16進位制
4\jstack [程序pid]|grep -A 100 [執行緒pid的16進位制] dump出jvm該執行緒的後100行,或者整個輸出到檔案
jstack -l pid > xxxfile
案例分析
現象:應用釋出後,過二十分鐘後load突然上升,居高不下. dump記憶體後沒發現有記憶體洩漏,初步懷疑有執行緒在不斷執行退不出.
驗證:根據上面的方法找出佔用cpu最高的java執行緒,dump出線程的後100行發現:
20881-thread-200" daemon prio=10 tid=0x0000000046edb800 nid=0x3bbb runnable [0x0000000044ad6000] java.lang.Thread.State: RUNNABLE at com.ibatis.sqlmap.engine.execution.SqlExecutor.getFirstResultSet(SqlExecutor.java:341) at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:299) at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:190) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:205) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106) at org.springframework.orm.ibatis.SqlMapClientTemplate$1.doInSqlMapClient(SqlMapClientTemplate.java:273) at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:209) at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:271)
可以看到SqlExecutor.getFirstResultSet在這個地方一直處於runnable.開啟原始碼如下:
while (hasMoreResults) {
rs = stmt.getResultSet();
if (rs != null) {
break;
}
hasMoreResults = moveToNextResultsIfPresent(stmt);
}
debug後發現在這個地方一直死迴圈
原因:review dao程式碼時發現一條update的操作是用selectForObject來跑的,接手過來的歷史程式碼傷不起啊,以前跑在oracle的時候不會出現這個問題,這次去o換成mysql後這個隱藏的雷終於爆發了.把相應的select改成update問題解決.
額外注意:問題能在測試環節發現,就不是問題,關鍵在於測試環節測試人員一直沒發現這個問題,到線上一下子就出來了.原因有兩個,一是測試環境走不到這個分支,也就是測試用例不充分;二是測試環境操作有限,死幾個執行緒問題不大,因為測試環境設定的超時時間比較短,導致問題沒有明顯暴露出來,到線上一下子就出來了.
相關推薦
java程序 cpu load過高分析過程
1\ jps -v列出所有的java程序 , top找出cpu佔用過高的對應的java 程序pid 2\ 使用top -H -p PID 命令檢視對應程序裡的哪個執行緒佔用CPU過高,取該執行緒pid 3\ 將執行緒的pid 轉成16進位制 4\jstack [程序
【轉】Linux下java程序CPU佔用率高分析方法
文章轉載的地址: https://blog.linuxeye.cn/343.html 在工作當中,肯定會遇到由程式碼所導致的高CPU耗用以及記憶體溢位的情況。這種情況發生時,我們怎麼去找出原因並解決。 一般解決方法是通過top命令找出消耗資源高的執行緒id,利用strace命令檢視該執行緒
linux檢視java程序cpu佔用過高
linux下查詢java程序佔用CPU過高原因1. 查詢程序top檢視程序佔用資源情況明顯看出java的兩個程序22714,12406佔用過高cpu. 2.查詢執行緒使用top -H -p <pid>檢視執行緒佔用情況 3.查詢java的堆疊資訊將執行緒id轉換成十
cpu load過高問題分析和解決
基本思維是有東西佔用的CPU_QUEUE,檢視一下程序的狀態。 top -H shift+o =選擇w (按照狀態排序) **1. 首先排查哪些程序cpu佔用率高。 通過命令 ps ux 2. 檢視對應Java程序的每個執行緒的CPU佔用率。通
分析JAVA應用CPU佔用過高的問題
使用jstack分析java程式cpu佔用率過高的有關問題 使用jstack分析java程式cpu佔用率過高的問題 1,使用jps查找出java程序的pid,如3707 2,使用top -p 14292 -H觀察該程序中所有執行緒的CPU佔用。
java執行CPU佔用過高追蹤
流程執行命令: 1.top 查到pid 28555 2.ps aux|grep 28555 確定到是tomcat的程序 3.顯示執行緒列表 ps -mp 28555 -o THREAD,tid,time 查到tid 28802 4. printf "%x\n" 2880
[zz]存大量被佔用(kswap程序CPU利用率過高)的解決方案
問題描述: 通過free檢視時,大概有一半以上的實體記憶體分配到cache裡面,這樣大的 cache是造成記憶體的耗盡緣由,與此同時使用top或ps檢視程序時,kswapd程序負荷 很高,一般在90%以上,kswapd程序的作用是用於記憶
linux主機cpu 佔用過高分析
1.用top命令檢視哪個程序佔用CPU高 gateway閘道器程序14094佔用CPU高達891%,這個數值是程序內各個執行緒佔用CPU的累加值。 PID USER PR NI VIRT RES SHR S %CPU %MEM T
查看JAVA程序CPU占用率高的問題
stack 程序 信息 界面 java棧 cpu占用率 color 堆棧 命令 1,獲得CPU占用率最高的PID top -c 進入界面之後,按P(大寫的P),按照CPU使用率排序,獲得PID,進程ID 2,獲得這個進程內的線程信息 top -Hp PID 進入
CPU load過高產生的原因及排查
之前面試被問到,造成CPU load過高的原因有哪些?如何快速排查其原因? 開一貼,總結該相關知識 什麼是cpu load 值 top命令中顯示的load average即為最近1分鐘、5分鐘和15分鐘的系統平均負載。 系統平均負載被定義為在特定
我的計算機問題解決之:NT Kernel & System 程序CPU佔用過高(開機便保持在50%)
按CPU排序之後你就會發現是什麼後臺服務佔用了那麼高的CPU,我到後來才發現竟然是91助手(連線android和PC的一個軟體),當時雖然解除安裝了91助手,但是它竟然在C:windows\System32\drivers下面留下了91Ass**.sys的一個檔案,每次進系統都會載入,直接導致了我的CPU佔用
cpu load過高問題排查
load average的概念 top命令中load average顯示的是最近1分鐘、5分鐘和15分鐘的系統平均負載。 系
面試問題---JAVA程式CPU佔用過高怎麼定位
今天一個電話面試問了這個問題。回來查了下答案,自己也順帶操作一遍,做個記錄。之前只知道jstack工具可以檢視執行緒狀態這些。比如死鎖這些,主要是之前不知道top -H -p pid這個命令的使用,這命令可以看到程序下面執行緒資訊,拿到執行緒ID,然後再結合jstack命令使用就可以解決這個問題了。下面記錄一
效能分析(3)- 短時程序導致使用者 CPU 使用率過高案例
效能分析小案例系列,可以通過下面連結檢視哦 https://www.cnblogs.com/poloyy/category/1814570.html 系統架構背景 VM1:用作 Web 伺服器,來模擬效能問題 VM2:用作 Web 伺服器的客戶端,來給 Web 服務增加壓力請求 使用兩臺虛擬
java線程數過高原因分析
分享 有一個 其中 res set ava jhat 前臺 沒有 作者:鹿丸不會多項式 出處:http://www.cnblogs.com/hechao123 轉載請先與我聯系。 一、問題描述 前陣子我們因為B機房故障,將所有的流量切到了A機房,在經歷了推送+自然高峰
(轉)java程序調用內存變化過程分析(詳細)
舉例 static成員 bsp 根據 執行方法 pip 狀態 font ear 原博地址: https://blog.csdn.net/Myuhua/article/details/81385609 (一)不含靜態變量的java程序運行時內存變化過程分析 代碼: 1 p
hadoop叢集System Cpu消耗過高問題分析--記憶體碎片整合問題
Hadoop叢集伺服器升級為rhel6核心後,System Cpu佔用非常高,有任務執行的時候經常到50%以上。對其中一臺機器一天的執行狀態取樣的資料: idle: 76% sys:14% user: 9% 從取樣資料中,可以發現System Cpu比User Cpu
Windows10系統下wsappx佔用CPU資源過高?wsappx是什麼?如何關閉wsappx程序?
在Windows10系統開機的時候,wsappx程序佔用的CPU資源非常高,導致電腦執行速度緩慢,那麼我們如何關閉wsappx程序,讓電腦加快執行速度呢?下面就一起來看一下操作的方法吧。 【現象】 1、先來看一下電腦剛開
postgresql某程序佔用cpu資源過高,降不下來
由於是開發階段,所以並沒有配置postgres的引數,都是使用安裝時的預設配置,以前執行也不見得有什麼不正常,可是前幾天我的cpu資源佔用突然升高.檢視程序,發現有一個postgres的程序佔用CPU都是80%以上,而且居高不下;剛開始以為是配置上需要修改,但事實上,預設配置基本上是很優化的,而且是開發階段,
windows伺服器java專案cpu佔用較高原因分析
前言 在windows平臺上要找出到底是哪個執行緒佔用的cpu還不那麼容易,linux用top就簡單多了最後的解決方法: 1.找到java程序對應的pid。 找pid的方法是:開啟工作管理員,然後點選 “檢視” 選單,然後點選 “選擇列”,把pid勾