[转]java调试
[原]https://www.cnblogs.com/yzlsthl/p/15193756.html
1 cpu、内存、io进程排查,使用 top、iotop、nethogs、iostat -x 1等命令
2 慢sql优化,加索引,sql逻辑
3 接口响应慢的,缓存
4 执行时间长的定时任务,异步
5 对3、4中的业务逻辑排查是否存在循环查库操作等
5 中间件(dubbo、redis、mysql等)性能参数优化,线程池大小等
6 jvm优化:jstack,gc等
1.top查进程线程状态, 默认top显示进程, 按H可以换到线程
top -H -p 123(查看进程123的各线程状态) ps -T -p 进程id(这个也可以查线程状态)
-H :Threads-mode operation
Instructs top to display individual threads. Without this command-line option a summation of all threads in each process is shown.
Later this can be changed with the `H' interactive command.
2.iostat -x 1 (可以显示io状态信息, -x表示显示额外信息, 1表示每隔一秒再显示一条记录)
3.nethogs(yum install - y nethogs, 可以显示网络负载信息, hog是猪的意思, 网络猪)
4.arthas(阿尔萨斯, 可以代替下面的java的工具)
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
使用命令:
https://arthas.aliyun.com/doc/commands.html
5.jprofile(图形界面, 可以远程调试, 收费的, 网上有破解版本的)
6.jps(JVM Process Status Tool)显示当前用户所有java进程
https://www.bilibili.com/video/BV1fe411A7JQ/?p=13&vd_source=9a71090579b2a9d19081c1fe558e9324
7.jstat -gc 28549(进程id) 500(每500ms刷新一条记录) (Java Virtual Machine Statistics Monitoring Tool)
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。
https://blog.csdn.net/achuo/article/details/107793361
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
8.jstack java进程中的堆栈信息
tid: java内的线程id
nid: 操作系统级别线程的线程id
prio: java内定义的线程的优先级
os_prio:操作系统级别的优先级
9.jmap 会卡顿(10-15%), 线上最好不要用(1.可以换时间执行, 2.复制访问到备份机上执行tcpcopy, 3.到测试环境上压测执行)
https://www.jianshu.com/p/1b1c998c4448
jmap -heap 1234 查看进程号为1234的Java程序的整个jvm内存状态
jmap -histo 1234 查找进程号为1234的java程序的jvm堆中对象详细占用情况
jmap -dump:format=b,file=/my.hprof 1234 导出1234进程的java程序的整个JVM信息(dump文件可以使用jvisualvm.exe查看)
jhat -J-Xmx1024M /my.dump, 启动web服务查看jmap导出的java程序的jvm信息。
jstack 1234 查看1234进程的所有堆栈信息。