- dump生成:jmp -dump:live,format=b,file=/tmp/some.bin PID。其中,加上live表示只dump存活的對象。
- 線程棧信息生成:jstack
- PID > /tmp/file.txt
- 找出占用CPU最多的線程:
- top -p PID -h 找到占用CPU最多的線程號(此命令結果顯示為PID,對應jstack里的nid)
- 獲取jstack;
- 將上面找到的線id轉為十六進制形式,通過grep命令可以從jstack里找到相應的線程信息
- grep 'nid' -B 10 -A 10 jstack.txt (使用grep獲取前后10行信息)
- MAT使用:
- Shallow Heap:對象本身占用的空間
- Retained Heap:對象本身及它引用依賴的所有對象占用的空間
- gc日志相關參數:
其中%p為進程ID,%t為時間,示例:gc_pid10442_2019-10-13_18-53-41_.log-Xms30m -Xmx30m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:/tmp/gc_%p_%t_.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/
- -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 -
參考文檔: