本身是名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相关的一些东西。