jstack: Java占用高CPU分析之- C2 Compiler Thread
1. 現象
應用剛上線時發現Java進程占用了大量的CPU份額,但過了幾分鐘后會降下來(流量沒變的情況下),因為已經做了負載均衡,于是拿一臺實例重新部署代碼上線來分析。具體分析步驟參考另外一篇文章《jstack: Java占用高CPU分析之- GC task thread》。這里簡單說一下步驟,重點是分析結果后的解決方法,不過強調一點:當發現Java應用占用高CPU的時候,先把Java的線程號和JVM的堆棧信息記錄到文件(這個可以用腳本實現),因為堆棧信息隨時在變。
2.定位
top | grep java
3.原因和解釋
定位到 C2 CompilerThread0這個線程占用了比較高的CPU。C2 Compiler 是JVM在server模式下字節碼編譯器,JVM啟動的時候所有代碼都處于解釋執行模式,當某些代碼被執行到一定閾值次數,這些代碼(稱為熱點代碼)就會被 C2 Compiler編譯成機器碼,編譯成機器碼后執行效率會得到大幅提升。
流量進來后,大部分代碼成為熱點代碼,這個過程中C2 Compiler需要頻繁占用CPU來運行,當大部分熱點代碼被編譯成機器代碼后,C2 Compiler就不再長期占用CPU了,這個過程也可以看作抖動。
4.解決方案
(1)最直接有效的方法是“預熱(warm up)”:可以使用Jmeter等壓測工具模擬線上訪問流量,讓C2 Compiler預先將熱點代碼編譯成機器碼, 減少對正式環境流量的影響。
(2) 設置JVM啟動參數:-XX:CICompilerCount=threads
默認是2, 可以設置4或6。在默認值下抖動時CPU已經滿載,設置成更多的線程也不一定起作用,但對于CPU“高而不滿”的情況會有用,能減少抖動時間。
參考文章:
http://www.javaworld.com/article/2078635/enterprise-middleware/jvm-performance-optimization-part-2-compilers.html
https://answers.atlassian.com/questions/22651310/c1c2-compiler-thread-eats-a-lot-of-cpu
http://www.cnblogs.com/LBSer/p/3703967.html
http://qa.blog.163.com/blog/static/190147002201392221426372/
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
總結
以上是生活随笔為你收集整理的jstack: Java占用高CPU分析之- C2 Compiler Thread的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十进制转化成二进制(C++)
- 下一篇: Java - 说一下表达式语言(EL)的