JAVAプロセス異常分析-CPU、メモリ

1795 ワード

現象:CPUがいっぱい走って、メモリが急速に増加して、サービスが崩壊します。
//   CPU    pid
# top  

//   dump  
# jstack -l  > cpu.log

//   cpu    tid
ps -mp  -o THREAD,tid,time | sort -rn

//     tid
printf "%x
" // cpu.log tid
  • 問題:C 2 CopilerThread
  • 理由と説明は、C 2 CopilerThread 0というスレッドが比較的高いCPUを占有しているためです。C 2 ComplerはJVMのServerモードでのバイトコードコンパイラであり、JVMが起動するとすべてのコードが解釈実行モードにあり、あるコードが一定の閾値回数まで実行されると、これらのコードはC 2 Copilerによってマシンコードにコンパイルされ、マシンコードにコンパイルされて実行効率が大幅に向上します。流量が入った後、ほとんどのコードがホットスポットコードになります。この過程でC 2 ComplerはCPUを頻繁に占用して運行します。大部分のホットスポットコードがマシンコードにコンパイルされた後、C 2 Copilerはもう長期的にCPUを占用しなくなります。この過程もジッタと見なされます。
    解決策(1)の最も直接的で効果的な方法は「ウォームアップ」です。Jmeter等圧測定ツールを使ってオンラインアクセス流量をシミュレーションできます。C 2 Copilerにあらかじめホットスポットコードをマシンコードにコンパイルして、正式な環境流量に対する影響を減少させます。
    (2)JVM起動パラメータを設定:-XX:CICommpilerCount=threadsコンパイルスレッド数は、デフォルトは2で、4または6を設定できます。デフォルト値でディザがいっぱいになっていて、より多くのスレッドに設定しても機能するとは限りませんが、CPUの「高すぎて不満」の場合に役立ち、ディザ時間を減らすことができます。
    (3)インターフェース呼び出し回数spring boot actuat orhttp://host:port/metrics 呼び出し回数と時間を調べる
    参考:http://www.xiuson.com/?p=203 https://cyberdak.github.io/jvm/2017/03/25/jvm-restart-cause-high-load http://www.blogjava.net/xylz/archive/2012/03/15/371966.html
  • 問題:GC task thread
  • //        
    jstat -gcutil pid 2000 10
    jmap -histo 
    jmap -dump:format=b,file=dumpFileName  //   
    jmap -dump:format=live,file=dumpFileName  //   
    
    一般的にGC問題、メモリ不足またはメモリ漏れです。
    MATツールを使ってメモリリーク分析を行います。http://www.eclipse.org/mat/downloads.php
    //-XX:+HeapDumpOnOutOfMemoryError            
    //-XX:HeapDumpPath=d:/a.dump          
    -Xmx20m -Xms20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/a.dump -XX:+PrintGCDetails
    
  • 問題:Locked ownable synchronizes