最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java線上問題排查之內(nèi)存占用大解決步驟

 更新時(shí)間:2026年01月11日 11:44:22   作者:讓丄帝愛伱  
線上的問題在通常有一些預(yù)警,比如CPU被打滿,網(wǎng)絡(luò)達(dá)到頂峰等等問題,這篇文章主要介紹了java線上問題排查之內(nèi)存占用大解決步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、快速排查流程

二、詳細(xì)排查步驟與命令

步驟1:快速定位問題進(jìn)程

# 1. 查看系統(tǒng)整體內(nèi)存使用
free -h
# 查看系統(tǒng)整體內(nèi)存
free -h && echo "---" && top -bn1 | head -10
top -p <java_pid>

# 2. 查找Java進(jìn)程內(nèi)存排名
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -20
# 定位Java進(jìn)程內(nèi)存排名
ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -15
# 查看Java進(jìn)程列表
jps -mlv | grep -v Jps
# 或者使用更專業(yè)的工具
nmon -s1 -c10

# 3. 確認(rèn)Java進(jìn)程基本信息
jps -mlv
jcmd -l

步驟2:分析JVM內(nèi)存分布

# 1. 查看堆內(nèi)存詳細(xì)分布
jhsdb jmap --heap --pid <pid>
jhsdb jmap --heap --pid $PID 2>/dev/null || jmap -heap $PID
# 2. 實(shí)時(shí)監(jiān)控GC和內(nèi)存使用
jstat -gcutil <pid> 1000 10
jstat -gccapacity <pid> 1000 5

# 3. 查看內(nèi)存各區(qū)域使用詳情
jcmd <pid> VM.native_memory summary scale=MB
jcmd $PID VM.native_memory summary scale=MB

# 檢查大對(duì)象分布
jmap -histo:live $PID | sort -k3 -nr | head -30 > large_objects.txt

關(guān)鍵指標(biāo)解讀:

  • OU(Old Utilization):老年代使用率 >80% 需關(guān)注
  • MU(Metaspace Utilization):元空間使用率
  • CCS(Compressed Class Space):壓縮類空間

步驟3:生成和分析堆轉(zhuǎn)儲(chǔ)

# 1. 生成堆轉(zhuǎn)儲(chǔ)文件(生產(chǎn)環(huán)境謹(jǐn)慎使用)
jmap -dump:live,format=b,file=heap_dump.hprof <pid>

# 2. 如果jmap不可用,使用jcmd(推薦)
jcmd <pid> GC.heap_dump filename=heap_dump.hprof
jcmd $PID GC.heap_dump filename=heap_$(date +%Y%m%d_%H%M%S).hprof

# 3. 僅統(tǒng)計(jì)對(duì)象數(shù)量(不影響服務(wù))
jmap -histo:live <pid> | head -50 > object_histo.txt
# 僅生成直方圖(生產(chǎn)環(huán)境安全)
jmap -histo $PID > object_histogram.tx

步驟4:分析堆轉(zhuǎn)儲(chǔ)文件

使用Eclipse MAT分析

# 下載MAT:https://www.eclipse.org/mat/
# 分析步驟:
1. File → Open Heap Dump
2. 查看Leak Suspects Report
3. 分析Dominator Tree
4. 查看重復(fù)字符串/集合大小

使用命令行快速分析

# 分析大對(duì)象
jhat heap_dump.hprof
# 訪問 http://localhost:7000 查看分析結(jié)果

# 或者使用jHiccup
java -jar jHiccup.jar -p <pid>

步驟5:檢查非堆內(nèi)存

# 1. 檢查元空間使用
jstat -gcmetacapacity <pid>

# 2. 檢查線程數(shù)量
ps -eLf | grep <pid> | wc -l
jstack <pid> | grep "java.lang.Thread.State" | wc -l
jstack $PID | grep "java.lang.Thread.State" | sort | uniq -c > thread_states.txt

# 3. 檢查直接內(nèi)存
jcmd <pid> VM.native_memory detail | grep -A10 "Internal"
# 類加載統(tǒng)計(jì)
jcmd $PID VM.classloader_stats 2>/dev/null

# 4. 檢查代碼緩存
jstat -gccapacity <pid> | grep -i code

三、具體場(chǎng)景排查命令

場(chǎng)景1:堆內(nèi)存泄漏排查

# 1. 實(shí)時(shí)監(jiān)控對(duì)象創(chuàng)建
jstat -gcutil <pid> 1s

# 2. 跟蹤GC日志(如果已開啟)
tail -f /path/to/gc.log
# 實(shí)時(shí)查看GC情況
tail -f /path/to/gc.log | grep -E "Full GC|GC.*Pause"
# 使用分析工具(需要下載gcviewer)
java -jar gcviewer.jar /path/to/gc.log

# 3. 檢查大對(duì)象
jmap -histo <pid> | sort -k3 -nr | head -20

# 4. 檢查Finalizer隊(duì)列
jcmd <pid> GC.finalizer_info

場(chǎng)景2:元空間溢出排查

# 1. 監(jiān)控元空間增長(zhǎng)
while true; do jstat -gcmetacapacity <pid>; sleep 2; done

# 2. 檢查類加載器
jcmd <pid> VM.classloader_stats

# 3. 檢查加載的類數(shù)量
jmap -clstats <pid>

# 4. 查找重復(fù)類
java -jar jarpath/classloader-analyzer.jar --pid <pid>

場(chǎng)景3:線程內(nèi)存泄漏排查

# 1. 生成線程轉(zhuǎn)儲(chǔ)
jstack <pid> > thread_dump.txt

# 2. 統(tǒng)計(jì)線程狀態(tài)
grep "java.lang.Thread.State" thread_dump.txt | sort | uniq -c

# 3. 檢查線程棧大小
jinfo <pid> | grep -i stack

# 4. 分析線程創(chuàng)建軌跡(如果有Arthas)
thread -n 10

場(chǎng)景4:直接內(nèi)存泄漏排查

# 1. 檢查NIO直接內(nèi)存
jcmd <pid> VM.native_memory summary | grep -A5 "Native Memory Tracking"

# 2. 監(jiān)控堆外內(nèi)存使用
pmap -x <pid> | sort -k3 -nr | head -10

# 3. 如果懷疑Netty等框架的內(nèi)存泄漏
# 添加JVM參數(shù):-XX:MaxDirectMemorySize=512m

四、使用Arthas進(jìn)行在線診斷

# 安裝并啟動(dòng)Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

# 內(nèi)存診斷命令
dashboard                    # 整體監(jiān)控面板
memory                       # 內(nèi)存詳情
heapdump --live /tmp/heap.hprof  # 在線堆轉(zhuǎn)儲(chǔ)

# 類加載監(jiān)控
classloader -t              # 類加載器樹
sc -d <ClassName>           # 查看類詳情

# 方法級(jí)監(jiān)控
monitor -c 5 com.example.Service methodName  # 方法執(zhí)行統(tǒng)計(jì)
watch com.example.Service methodName "{params,returnObj}" -x 3  # 觀察方法參數(shù)

五、容器環(huán)境特殊排查

# 1. 進(jìn)入容器
docker exec -it <container_id> /bin/bash

# 2. 檢查容器內(nèi)存限制
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
cat /sys/fs/cgroup/memory/memory.usage_in_bytes

# 3. 調(diào)整JVM內(nèi)存參數(shù)(如果設(shè)置不合理)
# 在啟動(dòng)參數(shù)中添加:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0

# 4. 檢查OOM Killer日志
dmesg | grep -i "killed process"
grep -i "oom" /var/log/messages

六、自動(dòng)化監(jiān)控腳本

內(nèi)存監(jiān)控腳本

#!/bin/bash
PID=$1
LOG_FILE="memory_monitor_${PID}.log"

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    # 收集內(nèi)存指標(biāo)
    HEAP_INFO=$(jstat -gcutil $PID 2>/dev/null | tail -1)
    THREAD_COUNT=$(ps -eLf | grep $PID | wc -l)
    
    echo "$TIMESTAMP | $HEAP_INFO | Threads: $THREAD_COUNT" >> $LOG_FILE
    sleep 30
done

快速排查一鍵腳本

#!/bin/bash
PID=$1
echo "=== 內(nèi)存問題快速排查 ==="
echo "1. 進(jìn)程信息:"
jps -mlv | grep $PID

echo -e "\n2. 內(nèi)存分布:"
jstat -gcutil $PID

echo -e "\n3. 對(duì)象統(tǒng)計(jì):"
jmap -histo $PID | head -30

echo -e "\n4. 線程統(tǒng)計(jì):"
jstack $PID | grep "java.lang.Thread.State" | sort | uniq -c

七、常見問題模式與解決方案

模式1:緩存無限增長(zhǎng)

癥狀: Old區(qū)持續(xù)增長(zhǎng),F(xiàn)ull GC后很快又滿
解決:

  • 檢查緩存失效策略
  • 添加緩存大小限制
  • 使用WeakReference/SoftReference

模式2:資源未關(guān)閉

癥狀: 直接內(nèi)存或文件描述符泄漏
解決:

  • 使用try-with-resources
  • 檢查數(shù)據(jù)庫連接池配置
  • 監(jiān)控文件描述符數(shù)量

模式3:類加載器泄漏

癥狀: 元空間持續(xù)增長(zhǎng),頻繁Full GC
解決:

  • 檢查熱部署/動(dòng)態(tài)類生成
  • 分析類加載器引用鏈
  • 重啟應(yīng)用服務(wù)

模式4:大對(duì)象分配

癥狀: 年輕代GC頻繁,對(duì)象直接進(jìn)入老年代
解決:

  • 調(diào)整-XX:PretenureSizeThreshold
  • 優(yōu)化大對(duì)象使用模式
  • 增加年輕代大小

根據(jù)癥狀快速定位問題

癥狀可能原因排查命令
Old區(qū)持續(xù)增長(zhǎng)內(nèi)存泄漏、緩存問題jmap -histo:live, MAT分析
頻繁Full GC內(nèi)存不足、元空間滿jstat -gcutil, 檢查Metaspace
Young GC頻繁新生代過小、短命對(duì)象多調(diào)整-XX:NewSize, 檢查代碼
元空間增長(zhǎng)類加載器泄漏、動(dòng)態(tài)類生成jcmd VM.classloader_stats
線程數(shù)暴漲線程池配置問題、阻塞jstack, 線程dump分析
堆外內(nèi)存高NIO DirectBuffer、JNIjcmd VM.native_memory

八、預(yù)防措施

# 1. 添加必要的JVM參數(shù)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dumps
-XX:ErrorFile=/path/to/hs_err_pid%p.log
-Xlog:gc*,gc+age=debug:file=/path/to/gc.log

# 2. 設(shè)置合理的內(nèi)存限制
-XX:MaxMetaspaceSize=512m
-XX:ReservedCodeCacheSize=256m
-Xss256k

# 3. 監(jiān)控告警配置
# 關(guān)鍵指標(biāo):堆使用率 >80%,F(xiàn)ull GC頻率,元空間增長(zhǎng)

總結(jié) 

到此這篇關(guān)于java線上問題排查之內(nèi)存占用大解決步驟的文章就介紹到這了,更多相關(guān)java內(nèi)存占用大內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Idea上傳、拉取、更新項(xiàng)目到gitee的實(shí)現(xiàn)

    Idea上傳、拉取、更新項(xiàng)目到gitee的實(shí)現(xiàn)

    該文章介紹了將Idea項(xiàng)目上傳至Gitee的步驟,包括創(chuàng)建本地倉庫、添加到緩沖區(qū)、提交到本地倉庫、推送至遠(yuǎn)程倉庫等以及從Gitee拉取項(xiàng)目的方法,整個(gè)過程涉及到創(chuàng)建遠(yuǎn)程倉庫、項(xiàng)目上傳、更新項(xiàng)目等和提交等內(nèi)容
    2026-04-04
  • Spring Boot 一個(gè)注解搞定加密 + 解密 + 簽名 + 驗(yàn)簽(一文全解)

    Spring Boot 一個(gè)注解搞定加密 + 解密 + 簽名

    本文介紹了一種基于Spring Boot 3.x的接口安全解決方案,通過自定義注解@ApiSecurity結(jié)合AOP切面,實(shí)現(xiàn)請(qǐng)求解密、驗(yàn)簽、響應(yīng)加密及加簽的自動(dòng)化處理,_springboot api aop 報(bào)文加解密
    2025-09-09
  • MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn)示例詳解

    MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn)示例詳解

    這篇文章主要介紹了MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn),我們可以將XML中重復(fù)出現(xiàn)的內(nèi)容提取出來放到sql標(biāo)簽中,當(dāng)需要用到sql標(biāo)簽中的內(nèi)容時(shí),用include標(biāo)簽將sql標(biāo)簽中的內(nèi)容引進(jìn)來即可,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令詳解

    JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令詳解

    jdk提供了很多強(qiáng)大的工具有命令行也有可視化的,這篇文章主要介紹了JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • SpringBoot中配置文件敏感信息加密解密的實(shí)現(xiàn)方案詳解

    SpringBoot中配置文件敏感信息加密解密的實(shí)現(xiàn)方案詳解

    在現(xiàn)代企業(yè)級(jí)應(yīng)用中,application.yml 或 application.properties 常用于配置數(shù)據(jù)庫等中間件的連接信息,但將明文密碼直接寫入配置文件中存在諸多風(fēng)險(xiǎn),下面我們就來看看如何對(duì)配置文件敏感信息加密解密吧
    2025-06-06
  • java使用GeoTools讀取shp文件并畫圖的操作代碼

    java使用GeoTools讀取shp文件并畫圖的操作代碼

    GeoTools是ArcGis地圖與java對(duì)象的橋梁,今天通過本文給大家分享java使用GeoTools讀取shp文件并畫圖,文章通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Springboot的yml配置文件用法

    Springboot的yml配置文件用法

    這篇文章主要介紹了Springboot的yml配置文件用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 客戶端設(shè)置超時(shí)時(shí)間真的很重要

    客戶端設(shè)置超時(shí)時(shí)間真的很重要

    今天小編就為大家分享一篇關(guān)于客戶端設(shè)置超時(shí)時(shí)間真的很重要,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring?Cloud?Gateway實(shí)現(xiàn)分布式限流和熔斷降級(jí)的示例代碼

    Spring?Cloud?Gateway實(shí)現(xiàn)分布式限流和熔斷降級(jí)的示例代碼

    這篇文章主要介紹了Spring?Cloud?Gateway實(shí)現(xiàn)分布式限流和熔斷降級(jí)的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-06-06
  • 淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類)

    淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類)

    這篇文章主要介紹了淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評(píng)論

岑巩县| 安乡县| 广德县| 九龙坡区| 湖南省| 普安县| 深水埗区| 泾川县| 中宁县| 双鸭山市| 五大连池市| 玛沁县| 乐昌市| 麻江县| 崇义县| 竹山县| 左云县| 襄樊市| 鄯善县| 修文县| 邳州市| 鱼台县| 二连浩特市| 安阳县| 三江| 遂昌县| 浏阳市| 章丘市| 上林县| 青海省| 霍山县| 永丰县| 肇东市| 拉孜县| 大足县| 清新县| 汉川市| 张北县| 昌吉市| 砚山县| 临猗县|