1. 程式人生 > >java程序 cpu load過高分析過程

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勾