jvm問題排查工具、命令


  1. dump生成:jmp -dump:live,format=b,file=/tmp/some.bin PID。其中,加上live表示只dump存活的對象。
  2. 線程棧信息生成:jstack
  3. PID > /tmp/file.txt
  4. 找出占用CPU最多的線程:
    1. top -p PID -h 找到占用CPU最多的線程號(此命令結果顯示為PID,對應jstack里的nid)
    2. 獲取jstack;
    3. 將上面找到的線id轉為十六進制形式,通過grep命令可以從jstack里找到相應的線程信息
    4. grep 'nid' -B 10 -A 10 jstack.txt (使用grep獲取前后10行信息)
  5. MAT使用:
    1. Shallow Heap:對象本身占用的空間
    2. Retained Heap:對象本身及它引用依賴的所有對象占用的空間
  6. gc日志相關參數:
     -Xms30m
     -Xmx30m
     -XX:+PrintGCDateStamps
     -XX:+PrintGCDetails
     -XX:+PrintHeapAtGC
     -XX:+PrintGCApplicationStoppedTime
     -Xloggc:/tmp/gc_%p_%t_.log
     -XX:+HeapDumpOnOutOfMemoryError
     -XX:HeapDumpPath=/tmp/
    
    其中%p為進程ID,%t為時間,示例:gc_pid10442_2019-10-13_18-53-41_.log
  7. -Xss理解
    個線程都有自己的Stack Space(堆棧)。這個Stack Space不是來自Heap的分配。所以Stack Space的大小不會受到-Xmx和-Xms的影響,這2個JVM參數僅僅是影響Heap的大小。Stack Space用來做方法的遞歸調用時壓入Stack Frame(棧幀)。所以當遞歸調用太深的時候,就有可能耗盡Stack Space,爆出StackOverflow的錯誤。
    -Xss256k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆 棧大小為1M,以前每個線程堆棧大小為256K。根據應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
    線程棧的大小是個雙刃劍,如果設置過小,可能會出現棧溢出,特別是在該線程內有遞歸、大的循環時出現溢出的可能性更大,如果該值設置過大,就有影響到創建棧的數量,如果是多線程的應用,就會出現內存溢出的錯誤.
    JVM可創建的最大線程數限制因素:線程堆棧大小->進程的最大內存->操作系統位數。
    jdk7的xss最小設置允許值為228k,否則jvm啟動報錯:The stack size specified is too small, Specify at least 228k

參考文檔:

  1. (譯)關於使用Eclipse Memory Analyzer的10點小技巧
  2. MAT OQL語法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM