乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java進(jìn)階必備:利用 JVM 命令(jstack、jmap)排查 CPU 100%、內(nèi)存泄露 問(wèn)題

       昵稱10087950 2022-06-16 發(fā)布于江蘇
      作者:青石路
      鏈接:https://www.cnblogs.com/youzhibing/p/13599874.html

      1開(kāi)心一刻

      圖片

      明明是個(gè)小 bug,但就是死活修不好,我特么心態(tài)崩了......

      2前言

      后文會(huì)從 Windows、Linux 兩個(gè)系統(tǒng)來(lái)做示例展示,有人會(huì)有疑問(wèn)了:為什么要說(shuō) Windows 版的 ?目前市面上還是有很多 Windows 服務(wù)器的,應(yīng)用于傳統(tǒng)行業(yè)、政府結(jié)構(gòu)、醫(yī)療行業(yè) 等等;兩個(gè)系統(tǒng)下的情況都演示下,有備無(wú)患

      后文中用到了兩個(gè)工具:Processor Explorer、MAT,它們是什么,有什么用,怎么用,本文不做介紹,不知道的小伙伴最好先去做下功課。

      3cpu 100%

      下面的示例中, cpu 的占有率沒(méi)到 100%,只是比較高,但是排查方式是一樣的,希望大家不要鉆牛角尖。

      Windows

      1、找到 cpu 占有率最高的 java 進(jìn)程號(hào)

      圖片

      PID:20260

      2、根據(jù)進(jìn)程號(hào)找到 cpu 占有率最高的線程號(hào)

      雙擊剛剛找到的 java 進(jìn)程:

      圖片

      線程號(hào):15900 ,轉(zhuǎn)成十六進(jìn)制:3e1c

      3、利用 jstack 生成虛擬機(jī)中所有線程的快照

      命令:jstack -l {pid} > {path}

      圖片

      文件路徑:D:\20260.stack

      4、線程快照分析

      我們先瀏覽下快照內(nèi)容:

      圖片

      內(nèi)容還算比較簡(jiǎn)潔,線程快照格式都是統(tǒng)一的,我們以一個(gè)線程快照簡(jiǎn)單說(shuō)明下:

      "main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable [0x00000000025cf000]

      圖片

      我們前面找到占 cpu 最高的線程號(hào):15900 ,十六進(jìn)制:3e1c ,用 3e1c  去快照文件里面搜一下:

      圖片

      自此,找到問(wèn)題。

      圖片

      Linux

      排查方式與 Windows 版一樣,只是命令有些區(qū)別。

      歡迎關(guān)注公眾號(hào)"Java學(xué)習(xí)之道",查看更多干貨!

      1、找到 cpu 占有率最高的 java 進(jìn)程號(hào)

      使用命令:top -c 顯示運(yùn)行中的進(jìn)程列表信息, shift + p 使列表按 cpu 使用率排序顯示:

      圖片

      PID = 2227 的進(jìn)程,cpu 使用率最高。

      2、根據(jù)進(jìn)程號(hào)找到 cpu 占有率最高的線程號(hào)

      使用命令:top -Hp {pid} ,同樣 shift + p 可按 cpu 使用率對(duì)線程列表進(jìn)行排序:

      圖片

      PID = 2228 的線程消耗 cpu 最高,十進(jìn)制的 2228 轉(zhuǎn)成十六進(jìn)制 8b4

      3、利用 jstack 生成虛擬機(jī)中所有線程的快照

      圖片

      4、線程快照分析

      分析方式與 Windows 版一致,我們可以把 2227.stack 下載到本地進(jìn)行分析,也可直接在 Linux 上分析。

      在 Linux 上分析,命令:cat 2227.stack |grep '8b4' -C 5

      圖片

      至此定位到問(wèn)題。

      圖片

      不管是在 Windows 下,還是在 Linux 下,排查套路都是一樣的:

      圖片

      4內(nèi)存泄露

      同樣的,Windows、Linux 各展示一個(gè)示例。歡迎關(guān)注公眾號(hào)"Java學(xué)習(xí)之道",查看更多干貨!

      Windows

      1、找到內(nèi)存占有率最高的進(jìn)程號(hào) PID

      圖片

      第一眼看上去, idea 內(nèi)存占有率最高,因?yàn)槲沂且?idea 啟動(dòng)的 java 進(jìn)程;idea 進(jìn)程我們無(wú)需關(guān)注,我們找到內(nèi)存占有率最高的 java 的 PID:10824

      2、利用  jmap 生成堆轉(zhuǎn)儲(chǔ)快照

      命令:jmap -dump:format=b,file={path} {pid}

      圖片

      dump 文件路徑:D:\heapdump_108244.hprof

      3、利用 MAT 分析 dump 文件

      MAT:Memory Analyzer Tool,是針對(duì) java 的內(nèi)存分析工具;下載地址:

      圖片

      選擇對(duì)應(yīng)的版本,下載后直接解壓;默認(rèn)情況下,mat 最大內(nèi)存是 1024m ,而我們的 dump 文件往往大于 1024m,所以我們需要調(diào)整,在 mat 的 home 目錄下找到 MemoryAnalyzer.ini ,將 Xmx1024m 修改成大于 dump 大小的空間, 我把它改成了 Xmx4096m

      接著我們就可以將 dump 文件導(dǎo)入 mat 中,開(kāi)始 dump 文件的解析:

      圖片

      解析是個(gè)比較漫長(zhǎng)的過(guò)程,我們需要耐心等待:

      圖片

      解析完成后,我們可以看到如下概況界面:

      圖片

      各個(gè)窗口的各個(gè)細(xì)節(jié)就不做詳細(xì)介紹了,有興趣的可自行去查閱資料;我們來(lái)看看幾個(gè)圖:餅狀圖、直方圖、支配樹(shù)、可疑的內(nèi)存泄露報(bào)告。

      餅狀圖:

      圖片

      可以看出, com.lee.schedule.Schedule 對(duì)象持有 1G 內(nèi)存,肯定有問(wèn)題。

      直方圖:

      圖片

      我們看下 Person 定義:

      @Setter
      @Getter
      @NoArgsConstructor
      @AllArgsConstructor
      public class Person {
          private String name;
          private Integer age;
      }

      可想而知,上圖標(biāo)記的幾項(xiàng)都與 Person 有關(guān)。

      支配樹(shù):

      圖片

      這就非常直觀了,Schedule 中的 ArrayList 占了 99.04% 的大小

      可疑的內(nèi)存泄露報(bào)告:

      圖片

      通過(guò)這些數(shù)據(jù),相信大家也能找到問(wèn)題所在了。

      圖片

      Linux

      排查方式與 Windows 一樣,只是有稍許的命令區(qū)別

      1、找到內(nèi)存占有率最高的進(jìn)程號(hào)

      使用命令:top -c 顯示運(yùn)行中的進(jìn)程列表信息, shift + m 按內(nèi)存使用率進(jìn)行排序

      圖片

      進(jìn)程號(hào):2527

      2、利用 jmap 生成堆轉(zhuǎn)儲(chǔ)快照

      命令:jmap -dump:format=b,file={path} {pid}

      圖片

      堆轉(zhuǎn)儲(chǔ)快照文件路徑:/opt/heapdump_2527.hprof

      3、利用 MAT 分析堆轉(zhuǎn)儲(chǔ)快照

      heapdump_2448.phrof 下載到本地,利用 MAT 進(jìn)行分析;分析過(guò)程與 Windows 版完全一致

      圖片

      自此,定位到問(wèn)題。

      Windows 下與 Linux 下,排查流程是一樣的

      圖片

      5總結(jié)

      JVM 常用命令

      • jps:列出正在運(yùn)行的虛擬機(jī)進(jìn)程
      • jstat:監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息,可以顯示虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù)
      • jinfo:實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)
      • jmap:生成堆轉(zhuǎn)儲(chǔ)快照,也可以查詢 finalize 執(zhí)行隊(duì)列、Java 堆和永久代的詳細(xì)信息
      • jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照
      • jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具:與 jmap 搭配使用,分析 jmap 生成的堆轉(zhuǎn)儲(chǔ)快照,與 MAT 的作用類似

      排查步驟

      • 1、先找到對(duì)應(yīng)的進(jìn)程:PID
      • 2、生成線程快照 stack (或堆轉(zhuǎn)儲(chǔ)快照:hprof
      • 3、分析快照(或堆轉(zhuǎn)儲(chǔ)快照),定位問(wèn)題

      內(nèi)存泄露、內(nèi)存溢出和 CPU 100% 關(guān)系

      圖片

      常用 JVM 性能檢測(cè)工具

      Eclipse Memory Analyer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr

      6參考

      • 一次完整的JVM堆外內(nèi)存泄漏故障排查記錄
      • 【原創(chuàng)】談?wù)劸€上CPU100%排查套路
      • 緊急修復(fù)一次線上商城系統(tǒng)高并發(fā)優(yōu)化實(shí)戰(zhàn)
      • 面試官:如果你們的系統(tǒng) CPU 突然飆升且 GC 頻繁,如何排查?
      • 記一次公司JVM堆溢出抽絲剝繭定位的過(guò)程
      • MAT:一次線上內(nèi)存泄漏排查
      • JVM探秘:MAT分析內(nèi)存溢出

      -End-

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多