国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java線上CPU內(nèi)存沖高問題排查步驟

這篇具有很好參考價值的文章主要介紹了Java線上CPU內(nèi)存沖高問題排查步驟。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

01 引言

作為一名從事Java開發(fā)快一年的程序員,在線上經(jīng)常碰到某個模塊的Pod發(fā)出CPU與內(nèi)存告警的問題,而這些問題會導(dǎo)致系統(tǒng)響應(yīng)緩慢甚至是服務(wù)不可用。一般情況下可以通過重啟或者調(diào)高Pod的資源量或者增加Pod數(shù)量暫時解決問題,但這是治標(biāo)不治本的,只有找到問題發(fā)生的原因才能從根本上解決問題。那么在該如何快速定位到導(dǎo)致告警的原因呢?下面將匯總一下大致的處理思路。

一般來說導(dǎo)致Java程序CPU與內(nèi)存沖高的原因有兩種:

  • 代碼中某個位置讀取數(shù)據(jù)量較大,導(dǎo)致系統(tǒng)內(nèi)存耗盡,從而導(dǎo)致Full GC次數(shù)過多,系統(tǒng)緩慢。

  • 代碼中有比較耗CPU的操作,導(dǎo)致CPU過高,系統(tǒng)運行緩慢。

  • 代碼某個位置有阻塞性的操作,導(dǎo)致該功能調(diào)用整體比較耗時,但出現(xiàn)是比較隨機的;

  • 某個線程由于某種原因而進入WAITING狀態(tài),此時該功能整體不可用,但是無法復(fù)現(xiàn);

  • 由于鎖使用不當(dāng),導(dǎo)致多個線程進入死鎖狀態(tài),從而導(dǎo)致系統(tǒng)整體比較緩慢。

前兩種情況出現(xiàn)的頻率較高,可能會導(dǎo)致系統(tǒng)不可用,后三種會導(dǎo)致某個功能運行緩慢,但是不至于導(dǎo)致系統(tǒng)不可用。

對于第一種情況,本人曾經(jīng)遇到過某個查全量數(shù)據(jù)的接口在某段時間被頻繁調(diào)用導(dǎo)致內(nèi)存耗盡、瘋狂GC的情況:記一次GC導(dǎo)致的CPU與內(nèi)存沖高的問題解決。下面將總結(jié)一些具體的排查步驟。

02 分析工具

01 top命令查看CPU占用情況

PID為進程編號,COMMAND為其中執(zhí)行命令,java即為要找的應(yīng)用

  • top: 展示所有進程占用情況

  • top -N num: 展示CPU占用最高的num個進程

root@8d36124607a0:/# top

top - 14:01:23 up 1 day, 17:54,  1 user,  load average: 0.00, 0.01, 0.05Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie%Cpu(s):  0.8 us,  1.2 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stKiB Mem :  3782864 total,  1477524 free,   329656 used,  1975684 buff/cacheKiB Swap:        0 total,        0 free,        0 used.  3181392 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  9   root      20   0 1031064  52580  19248 S  90.3 10.4  26:30.37 javacatalina.sh
root@8d36124607a0:/# top -Hp 9

top - 08:31:16 up 30 min,  0 users,  load average: 0.75, 0.59, 0.35Threads:  11 total,   1 running,  10 sleeping,   0 stopped,   0 zombie%Cpu(s):  3.5 us,  0.6 sy,  0.0 ni, 95.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stKiB Mem:   2046460 total,  1924856 used,   121604 free,    14396 buffersKiB Swap:  1048572 total,        0 used,  1048572 free.  1192532 cached Mem  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
   10 root      20   0 2557160 289824  15872 R 79.3 14.2   0:41.49 java
   11 root      20   0 2557160 289824  15872 S 1.2  14.2   0:06.78 java

可以看到占用CPU消耗最高的PID為10,該ID即為線程ID,使用如下命令將其轉(zhuǎn)化為16進制格式:

root@8d36124607a0:/# printf "%x\n" 10

得到輸出a線程即為0xa。

02 用jstack查看Java線程信息

  • jstack?進程號 | grep 線程ID:查看線程堆棧信息,將上一步驟的Java線程進程ID與CPU占用量較高的線程ID(16進制格式)填入其中。

  • jstack pid >> stack.txt:將今后曾所有堆棧信息都打印到stack.txt中

root@8d36124607a0:/# jstack 9 | grep 0xa

"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”
 

第一個雙引號圈起來的就是線程名,如果是“VM Thread”這就是虛擬機GC回收線程,如果是"main"則是其他線程,后面的runnable是線程狀態(tài)。

03 使用jstat查看GC信息

  • jstat -gcutil 進程號?統(tǒng)計間隔毫秒 統(tǒng)計次數(shù)(缺省代表一直統(tǒng)計)

root@8d36124607a0:/# jstat -gcutil 9 1000 10

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT  0.00   0.00   0.00  75.07  59.09  59.60   3259    0.919  6517    7.715    8.635
  0.00   0.00   0.00   0.08  59.09  59.60   3306    0.930  6611    7.822    8.752
  0.00   0.00   0.00   0.08  59.09  59.60   3351    0.943  6701    7.924    8.867
  0.00   0.00   0.00   0.08  59.09  59.60   3397    0.955  6793    8.029    8.984
 

查看某進程GC持續(xù)變化情況,如果發(fā)現(xiàn)返回中FGC很大且一直增大,確認(rèn)為Full GC! 也可以使用“jmap -heap 進程ID”查看一下進程的堆內(nèi)從是不是要溢出了,特別是老年代內(nèi)從使用情況一般是達(dá)到閾值(具體看垃圾回收器和啟動時配置的閾值)就會進程Full GC。

04 使用Jmap分析內(nèi)存

  • jmap -dump:format=b,file=文件名稱 進程ID?:

    生成內(nèi)存dump文件,進行離線分析。

  • dump文件界面分析工具:

    IBM HeapAnalyzer,點擊進入找到ha457.jar的下載鏈接進行下載

  • java -Xmx4G -jar ha457.jar:

    運行jar文件,如果dump文件過大可以使用-Xmx設(shè)置最大堆內(nèi)存大小,防止內(nèi)存溢出。

通過ha457.jar的GUI界面可以很清晰的看到各種類型的數(shù)據(jù)內(nèi)存占用情況、對象之間的引用關(guān)系以及可能存在內(nèi)存泄漏的對象。

Java線上CPU內(nèi)存沖高問題排查步驟

03 原因分析

01 Full GC次數(shù)過多

相對來說,這種情況是最容易出現(xiàn)的,尤其是新功能上線時。對于Full GC較多的情況,其主要有如下兩個特征:

  • 線上多個線程的CPU都超過了100%,通過jstack命令可以看到這些線程主要是垃圾回收線程

  • 通過jstat命令監(jiān)控GC情況,可以看到Full GC次數(shù)非常多,并且次數(shù)在不斷增加。

初步排查:使用top與top -Hp命令找到CPU占用最高的Java線程,將其轉(zhuǎn)為16進制后,使用jstack命令抓取該線程信息,發(fā)現(xiàn)線程名稱是"VM Thread"垃圾回收線程。


進一步確認(rèn):?使用jstat -gcutil命令查看gc次數(shù)與增長情況。
進一步分析:使用jmap -dump命令dump內(nèi)存,然后使用使用ha457.jar離線分析。

  • 生成大量的對象,導(dǎo)致內(nèi)存溢出

  • 內(nèi)存占用不高,但是Full GC次數(shù)還是比較多,此時可能是代碼中手動調(diào)用?System.gc()導(dǎo)致GC次數(shù)過多。

02 某個業(yè)務(wù)邏輯執(zhí)行時間過長

如果是Full GC次數(shù)過多,那么通過 jstack得到的線程信息會是類似于VM Thread之類的線程,而如果是代碼中有比較耗時的計算,那么我們得到的就是一個線程的具體堆棧信息。

如下是一個代碼中有比較耗時的計算,導(dǎo)致CPU過高的線程信息:

Java線上CPU內(nèi)存沖高問題排查步驟

這里可以看到,在請求UserController的時候,由于該Controller進行了一個比較耗時的調(diào)用,導(dǎo)致該線程的CPU一直處于100%。我們可以根據(jù)堆棧信息,直接定位到UserController的34行,查看代碼中具體是什么原因?qū)е掠嬎懔咳绱酥摺?/p>

03 死鎖

如果有死鎖,會直接提示。關(guān)鍵字:deadlock。使用jstack打印線程信息會打印出業(yè)務(wù)死鎖的位置。

Java線上CPU內(nèi)存沖高問題排查步驟

04 程一直處于WAITTING狀態(tài)

對于這種情況,這是比較罕見的一種情況,但是也是有可能出現(xiàn)的,而且由于其具有一定的 “不可復(fù)現(xiàn)性”,因在排查的時候是非常難以發(fā)現(xiàn)的。

某個線程由于某種原因而進入WAITING狀態(tài),此時該功能整體不可用,但是無法復(fù)現(xiàn)。jstack多查詢幾次,每次間隔30秒,對比一直停留在parking 導(dǎo)致的WAITING狀態(tài)的線程。

可以通過給線程命名快速定位到是哪個業(yè)務(wù)代碼。

05 隨機出現(xiàn)大量線程訪問接口緩慢

對于這種情況,比較典型的例子就是,我們某個接口訪問經(jīng)常需要2~3s才能返回。

這是比較麻煩的一種情況,因為一般來說,其消耗的CPU不多,而且占用的內(nèi)存也不高,也就是說,我們通過上述兩種方式進行排查是無法解決這種問題的。

而且由于這樣的接口耗時比較大的問題是不定時出現(xiàn)的,這就導(dǎo)致了我們在通過 jstack命令即使得到了線程訪問的堆棧信息,我們也沒法判斷具體哪個線程是正在執(zhí)行比較耗時操作的線程。

對于不定時出現(xiàn)的接口耗時比較嚴(yán)重的問題,我們的定位思路基本如下:

首先找到該接口,通過壓測工具不斷加大訪問力度,如果說該接口中有某個位置是比較耗時的,由于我們的訪問的頻率非常高,那么大多數(shù)的線程最終都將阻塞于該阻塞點

這樣通過多個線程具有相同的堆棧日志,我們基本上就可以定位到該接口中比較耗時的代碼的位置。

如下是一個代碼中有比較耗時的阻塞操作通過壓測工具得到的線程堆棧日志:

Java線上CPU內(nèi)存沖高問題排查步驟

從上面的日志可以看你出,這里有多個線程都阻塞在了UserController的第18行,說明這是一個阻塞點,也就是導(dǎo)致該接口比較緩慢的原因。

04 總結(jié)

1、排查命令總結(jié)

  • top:

    查看系統(tǒng)進程CPU與內(nèi)存占用情況,找到占用最多的進程ID

  • top -Hp 進程號:

    查看該進程號的所有線程CPU與內(nèi)存占用情況,找到占用最多的線程ID(顯示的PID即為10進制線程編號,printf "%x\n" 進程號轉(zhuǎn)為16進制線程號)

  • jstack 進程號 >> stack.txt:

    將進程號所屬進程的堆棧信息輸出到stack.txt中

  • jstack 進程號 | grep 16進制線程號:

    查看進程號先所屬線程的堆棧信息,可查看線程名,區(qū)分出普通線程與GC線程("VM Thread")。

  • jstat -gcutil 進程號?統(tǒng)計間隔毫秒 統(tǒng)計次數(shù)(缺省代表一直統(tǒng)計):

    如果是因為GC問題,進一步觀察GC情況

  • jmap -heap 進程ID:

    查看詳細(xì)進程內(nèi)存使用信息

  • jmap -dump:format=b,file=文件名稱 進程ID:

    將進程內(nèi)存信息dump到磁盤上供進一步分析。

  • java -Xmx4G -jar ha457.jar:

    使用ha457.jar來分析內(nèi)存泄漏情況。

2、異常情況解決總結(jié)

  • GC問題:

    top+top -Hp + jstack排查是"VM Thread"消耗過多資源,可以進一步使用jmap工具進行內(nèi)存溢出排查。

  • 業(yè)務(wù)執(zhí)行過慢問題:

    top+top -Hp + jstack排查發(fā)現(xiàn)是普通業(yè)務(wù)線程,可看到具體是哪個接口。

  • 死鎖:

    jstack + Java進程打印堆棧信息中包含死鎖信息deadlock

  • 線程處于waiting狀態(tài):

    多打印幾次jstack信息,對比一直停留在waiting狀態(tài)的線程。

最后:?下方這份完整的軟件測試視頻學(xué)習(xí)教程已經(jīng)整理上傳完成,朋友們?nèi)绻枰梢宰孕忻赓M領(lǐng)取【保證100%免費】

Java線上CPU內(nèi)存沖高問題排查步驟

?這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!

Java線上CPU內(nèi)存沖高問題排查步驟文章來源地址http://www.zghlxwxcb.cn/news/detail-467508.html

到了這里,關(guān)于Java線上CPU內(nèi)存沖高問題排查步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【面試】線上Java程序占用 CPU 過高請說一下排查方法?

    【面試】線上Java程序占用 CPU 過高請說一下排查方法?

    這個問題可以說是 Java 面試的高頻面試題了,有很多面試官都喜歡問這個問題,問題可能是下面這樣的。 線上一臺服務(wù)器 CPU 使用率100% 了,如果你碰到這樣的情況,如何排查并找到問題原因? 這就是一個套路題,所謂套路題就是有標(biāo)準(zhǔn)的套路解法的,掌握了套路,不僅能解

    2024年02月09日
    瀏覽(25)
  • 【Java高CPU占用排查步驟】

    當(dāng)Java應(yīng)用程序在Linux系統(tǒng)上的CPU使用率達(dá)到100%時,可能會導(dǎo)致系統(tǒng)響應(yīng)變慢,甚至無響應(yīng),影響應(yīng)用程序的正常運行。下面是排查Java應(yīng)用程序CPU使用率高的步驟: 可以使用top命令查看Linux系統(tǒng)上Java進程的CPU使用率,找到占用CPU資源較高的進程??梢园凑誄PU使用率排序,找到

    2024年02月10日
    瀏覽(29)
  • springboot應(yīng)用,cpu高、內(nèi)存高問題排查

    springboot應(yīng)用,cpu高、內(nèi)存高問題排查

    前幾天,排查了2個生產(chǎn)問題。一個cpu高,一個內(nèi)存高。今天把解決過程整理一下 先說cpu高的這個問題 新系統(tǒng),上線半年,一直比較穩(wěn)定。有一天,運維過來說:cpu有點高,超過80%了。這個系統(tǒng)的量沒有那么大,也沒有什么很復(fù)雜的計算任務(wù)。cpu不應(yīng)該這么高。 1.1、獲取棧日

    2024年02月19日
    瀏覽(21)
  • Java進程CPU高負(fù)載排查步驟

    Java進程CPU高負(fù)載排查步驟

    近期發(fā)現(xiàn)服務(wù)器Java進程負(fù)載,超過100% 登錄服務(wù)器,執(zhí)行top命令,查看CPU占用情況,找到進程的pid 很容易發(fā)現(xiàn),PID為29706的java進程的CPU飆升到700%多,且一直降不下來,很顯然出現(xiàn)了問題。 使用 top -Hp pid 命令(為Java進程的id號)查看該Java進程內(nèi)所有線程的資源占用情況 很容

    2024年02月14日
    瀏覽(23)
  • Java應(yīng)用CPU占用過高問題排查

    測試環(huán)境CPU突然升高,日志查詢無異常,可以通過使用jvm的調(diào)試工具定位問題。 1.定位java服務(wù)進程 2.定位java線程 3.定位代碼塊 1.定位進程 獲取cpu占用高的進程pid 2.定位線程 轉(zhuǎn)16進制 3.定位代碼 目的:將當(dāng)前堆棧信息保存為文件,通過16進制的TID查找問題所在的代碼塊;

    2024年02月12日
    瀏覽(22)
  • 得物-Golang-記一次線上服務(wù)的內(nèi)存泄露排查

    得物-Golang-記一次線上服務(wù)的內(nèi)存泄露排查

    在風(fēng)和日麗的一天,本人正看著需求、敲著代碼,展望美好的未來。突然收到一條內(nèi)存使用率過高的告警。 告警的這個項目,老代碼是python的,最近一直在go化。隨著go化率不斷上升,發(fā)現(xiàn)內(nèi)存的RSS使用率越飆越高。最終達(dá)到容器內(nèi)存限制后,進程會自動重啟。RSS如下圖所示

    2024年02月04日
    瀏覽(20)
  • 排查Docker容器Java程序CPU過高問題以及處理方法

    因為Docker里java程序運行環(huán)境是用的jre,沒有top和jstack命令,所以要在容器里安裝top和jattach,來查看和導(dǎo)出線程信息。 系統(tǒng):Debian10 鏡像:openjdk:8u275-jre-slim-buster 容器ID:99abe55a98dc 一.安裝top: ?? ?1.進入容器: ? ?? ?2.因為官方鏡像地址太慢,所以 修改源地址:https://develop

    2024年02月11日
    瀏覽(21)
  • java性能安全:OOM問題排查、Arthas分析高CPU問題、防止Dos攻擊

    一、OOM問題 分析流程: 第一步:進程分析,分析老年代回收次數(shù)和消耗時間 第二步:日志分析,找出OOM發(fā)生時間的日志來鎖定執(zhí)行方法,對應(yīng)的機器ip 第三步:找到對應(yīng)的ip機器查看,進一步分析 第四步:下載的dump,使用mat分析堆內(nèi)存,找到堆占用率前3,查看堆指向 問題

    2024年02月03日
    瀏覽(45)
  • k8s排查Java應(yīng)用CPU負(fù)載過高問題

    k8s排查Java應(yīng)用CPU負(fù)載過高問題

    因為k8s發(fā)布的pod還未加入資源的監(jiān)控,在查看pod負(fù)載時發(fā)現(xiàn)其中pod占用1核CPU 2.1通過debug排查 下一步可以到對應(yīng)的node節(jié)點查看對應(yīng)進程的信息,也可以通過debug在當(dāng)前節(jié)點進行排查(當(dāng)節(jié)點太多懶得登錄過去時) top命令找到所在節(jié)點進程信息,找到問題進程 查看詳細(xì)線程 通

    2024年02月05日
    瀏覽(25)
  • 線上FullGC問題排查實踐——手把手教你排查線上問題

    線上FullGC問題排查實踐——手把手教你排查線上問題

    作者:京東科技 韓國凱 問題起因是我們收到了jdos的容器CPU告警,CPU使用率已經(jīng)達(dá)到104% 觀察該機器日志發(fā)現(xiàn),此時有很多線程在執(zhí)行跑批任務(wù)。正常來說,跑批任務(wù)是低CPU高內(nèi)存型,所以此時考慮是FullGC引起的大量CPU占用(之前有類似情況,告知用戶后重啟應(yīng)用后解決問題

    2024年02月02日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包