系統(tǒng)運(yùn)維問(wèn)題排查-java內(nèi)存過(guò)高分析及說(shuō)明
1、查看內(nèi)存使用情況
使用top查看進(jìn)程使用內(nèi)存情況,shift+m讓內(nèi)存使用率按照降序排序,shift+p讓cpu使用率按照降序排序。

2、查看某個(gè)進(jìn)程的線程情況
ps p $pid -L -o pcpu,pmem,pid,tid,time,tname,cmd
3、執(zhí)行 jmap $pid命令觀察內(nèi)存使用情況

4、執(zhí)行 jstat -gcutil $pid 5s 命令查看內(nèi)存使用情況

結(jié)果列含義:
- S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比
- S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比
- E — Heap上的 Eden space 區(qū)已使用空間的百分比
- O — Heap上的 Old space 區(qū)已使用空間的百分比
- P — Perm space 區(qū)已使用空間的百分比
- YGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Young GC 的次數(shù)
- YGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Young GC 所用的時(shí)間(單位秒)
- FGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Full GC 的次數(shù)
- FGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full GC 所用的時(shí)間(單位秒)
- GCT — 從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間(單位秒)
- GCT 是YGCT 和FGCT的時(shí)間總和。
5、執(zhí)行 jmap –heap $pid 命令
查看各內(nèi)存區(qū)域的設(shè)置
6、執(zhí)行 jmap -histo:live $pid 命令
查看每個(gè) class 的實(shí)例數(shù)目、內(nèi)存使用率和類全名。每分鐘執(zhí)行一次,連續(xù)執(zhí)行 5 次

7、獲取dump文件
jmap -dump:live format=b,file=./dump.bin $pid
8、查看進(jìn)程堆棧信息
jstack -l $pid> /usr/local/temp/jstack.log

JSTACK命令打印解析
日志格式
- "Keep-Alive-Timer"代表線程的名稱。在實(shí)際開(kāi)發(fā)中,要取一個(gè)和業(yè)務(wù)相關(guān)、見(jiàn)名知意的名字,便于排查問(wèn)題。
- “prio=8”表示線程的優(yōu)先級(jí)。
- “os_prio=0”表示操作系統(tǒng)級(jí)別的優(yōu)先級(jí)。
- “tid=0x000055868e1e9000”表示線程id。
- “nid=0x394f”表示操作系統(tǒng)映射的線程id。
- “0x00007fabd4f44000”表示線程棧的起始地址。
具體分析
waiting to lock <0x00000000d6349040>,即試圖在地址為0x00000000d6349040所在的對(duì)象獲取鎖;而該對(duì)象卻被線程加了鎖(locked <0x00000000d6349040>)。
- waiting on condition [0x00007fabd5b4e000]:說(shuō)明正在等待某個(gè)條件觸發(fā)。
- waiting for monitor entry [0x000000001bbcf000]:說(shuō)明該線程正在等待獲取鎖。
其中:java.lang.Thread.State: WAITING (parking):一直等那個(gè)條件發(fā)生;
java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定時(shí)的,那個(gè)條件不到來(lái),也將定時(shí)喚醒自己。MEM。
注意:jmap和jstack需要使用與進(jìn)程一致的用戶才能執(zhí)行
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Cloud?Gateway整合sentinel?實(shí)現(xiàn)流控熔斷的問(wèn)題
本文給大家介紹下?spring?cloud?gateway?如何整合?sentinel實(shí)現(xiàn)流控熔斷,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友一起看看吧2022-02-02
java開(kāi)發(fā)之File類詳細(xì)使用方法介紹
這篇文章主要介紹了java開(kāi)發(fā)之File類詳細(xì)使用方法介紹,需要的朋友可以參考下2020-02-02
mybatis學(xué)習(xí)之路mysql批量新增數(shù)據(jù)的方法
這篇文章主要介紹了mybatis學(xué)習(xí)之路mysql批量新增數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
推薦兩款java開(kāi)發(fā)實(shí)用工具 hutool 和 lombok
通過(guò)本文給大家推薦兩款java開(kāi)發(fā)實(shí)用工具 hutool 和 lombok,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-04-04
Java Spring中Quartz調(diào)度器詳解及實(shí)例
這篇文章主要介紹了Java Spring中Quartz調(diào)度器詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
SpringBoot中六種批量更新Mysql的方式效率對(duì)比分析
文章比較了MySQL大數(shù)據(jù)量批量更新的多種方法,指出REPLACE INTO和ON DUPLICATE KEY效率最高但存在數(shù)據(jù)風(fēng)險(xiǎn),MyBatis-Plus分批更新較優(yōu),CASE WHEN因循環(huán)多效率較低,建議根據(jù)項(xiàng)目限制選擇合適方案并分批處理以避免SQL阻塞2025-07-07
Springboot中的@ConditionalOnBean注解詳細(xì)解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細(xì)解讀,@ConditionalOnMissingBean注解兩個(gè)類,一個(gè)Computer類,一個(gè)配置類,想要完成;如果容器中沒(méi)有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11

