本身是名Java開發,在做了一段大數據的工作后,猛然間想對Java做個總結。
從未寫過技術博客,一時不知如何開始,思慮后,暫且以自己喜愛的方式來開篇。
工作中遇到過CPU或內存過高的問題,解決步驟:
- 通過top命令查看,得到pid.
- 通過ps -mp <pid> -o THREAD,tid,time,pid 命令,拿到tid.
- 使用jdk自動的工具,jstack -l 15605 > stack.txt,得到此時的線程狀態。(Stack文件描述了當時每個線程的狀態,這是一個很強大的知識點,后面慢慢細說。)
- 將步驟2中得cpu過高的tid,由十進制轉換為16進制(如果是windows server也可以通過在線的一些工具進行轉換。)
- 使用命令grep "3cfb" stack.txt -A30在生成的stack文件中查找,可以看出當前的程序是由於進行GC導致的cpu過高。
- JVM內存占滿會觸發GC(這是個知識點,GC的觸發機制,下節在細說),那我們就用jdk自帶的工具查看下此時的內存情況。jmap -dump:file=heap.dump,format=b <pid>
- 通過jdk自帶工具,jhat -JXmx1G heap.dump解析dump文件。(生成的dump文件一般會很大,所以需要大內存的PC去解析。另外,MAT(MemoryAnalyzer Tool)工具是eclipse的一個插件,也可以分析dump文件)
- Jhat命令在7000端口自動部署了web,可以通過serverIp:7000訪問
這是解決問題的的一個具體方法,這里涉及到了很多知識點,我准備依此為據,將知識點串起來。下次寫GC相關的一些東西。