jvm高階版

netstat -aon|findstr "8080"

jdk/bin

jinfo是用來查看JVM參數和動態修改部分JVM參數的命令
jstat命令是使用頻率比較高的命令,主要用來查看JVM運行時的狀態信息,包括內存狀態、垃圾回收等。
jstat -gcutil 11666 1000 3
jstack是用來查看JVM線程快照的命令,線程快照是當前JVM線程正在執行的方法堆棧集合
jmap是用來生成堆dump文件和查看堆相關的各類信息的命令
jhat是用來分析jmap生成dump文件的命令,jhat內置了應用服務器


jinfo查看配置啓動參數

jdk版本一定要匹配idea
jmap -heap pid
查看jvm中各年代佔有 和jvm配置參數


查看jvm中運行狀態和垃圾回收
jstat -gcutil pid 1000 3
字段意思
https://www.cnblogs.com/wxisme/p/9878494.html
我的是FGC 老年代垃圾回收次數太頻繁。原因是M 元數據區使用百分比太高,經常容易滿,把大小擴大!!(放了很多靜態方法)


jstack pid > stack.txt
字段意思
https://blog.csdn.net/sheldon178/article/details/79543671
這個線程池pool-1-thread-97好久都沒消失,核心線程只有20,設置的空閒時間太大keepAliveTime=200s!TimeUnit.MILLISECONDS弄錯了
線程的狀態分析  Thread- 用戶線程!!
runnable
Wait on condition,從線程 stack看, 正等待網絡讀寫,這可能是一個網絡瓶頸的徵兆。因爲網絡阻塞導致線程無法執行   業務無限循環udp接口。。後續可以用netty
Waiting for monitor entry 和 in Object.wait(),只能被一個線程擁有,該線程就是 “Active Thread”而其它線程都是 “Waiting Thread”
            entryset -> monitor <->waitset與上面對應狀態
Unsafe.park方法,上述代碼中,主要通過一個_counter作爲判斷標誌,當_counter大於0時候,就說明了擁有了“許可”
連續幾次輸出線程堆棧信息都存在於同一個或多個線程上時,則說明系統中有鎖競爭激烈,死鎖,或鎖餓死的想象。!!!!

jmap –dump:live,format=b,file=heap.bin pid
分析工具啓動
jhat -J-Xmx1024M file
端口一般是7000
神器jvisualvm.exe!!!!誰用誰知道
dump不同時間,可以看出類實例差別。當堆佔用太高,一直增加。看這個沒毛病

結合Jconsle分析
看見堆內存一直在上升。看具體的模塊 發現edeb space不斷增大,發現無限循環在一直創建對象!!!!!
byte[] buffer = new byte[max_udp_data_size];提到for循環外面
手動gc 年輕代
D:\soft\download\jdk\bin>jstat -gcutil 7556 1000 3
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  90.51  16.62  94.63  92.61     10    0.144     3    0.256    0.399
  0.00   0.00  90.51  16.62  94.63  92.61     10    0.144     3    0.256    0.399
  0.00   0.00  90.74  16.62  94.63  92.61     10    0.144     3    0.256    0.399

D:\soft\download\jdk\bin>jstat -gcutil 7556 1000 3
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00   3.34  14.97  94.30  91.94     11    0.172     4    0.498    0.671
  0.00   0.00   3.34  14.97  94.30  91.94     11    0.172     4    0.498    0.671
  0.00   0.00   3.34  14.97  94.30  91.94     11    0.172     4    0.498    0.671
  
ygc平均耗時=YGCT/YGC(s)

ygc時間間隔=YGC/程序的運行時間
  
■ Minor GC執行時間不到50ms;
■ Minor GC執行不頻繁,約10秒一次;
■ Full GC執行時間不到1s;
■ Full GC執行頻率不算頻繁,不低於10分鐘1次。

eden 區內存無法爲一個新對象分配內存時,就會觸發 Minor GC
old和永久代空間不夠 觸發 Full GC

!!!!
查看gc日誌-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs
Full GC (Metadata GC Threshold) [PSYoungGen: 5113K->0K(71680K)] [ParOldGen: 5991K->7212K(60416K)] 11105K->7212K(132096K), [Metaspace: 20589K->20589K(1067008K)], 0.0476458 secs] [Times: user=0.05 sys=0.00, real=0.05 secs] 
gc前後大小
年輕代垃圾回收前的大小->年輕代回收後的大小(年輕代總大小)


應用掛是一瞬間的事情,掛了之後就沒辦法生成dump文件了。所以首先要設置一下自動生成dump文件
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/tmp/heapdump.hprof

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章