本文主要介绍下平常可能会使用到的命令:jps、jinfo、jmap、jstat、jstack
jps
jps主要是查看Java进程号,有个Java进程号后面的命令也才能发挥作用
![68f5d418282cbacb0ce7a461d9623fb2.png](https://img-blog.csdnimg.cn/img_convert/68f5d418282cbacb0ce7a461d9623fb2.png)
jps -help可以列出jps支持的参数,大家可以试一下
![5bd29371da8c7f9e1f7f03c61b9c25c0.png](https://img-blog.csdnimg.cn/img_convert/5bd29371da8c7f9e1f7f03c61b9c25c0.png)
jinfo
![5e95ab8fae1f202fa51a473099c5d078.png](https://img-blog.csdnimg.cn/img_convert/5e95ab8fae1f202fa51a473099c5d078.png)
![65e501d7d4c80bbd6c37ec99406b5d69.png](https://img-blog.csdnimg.cn/img_convert/65e501d7d4c80bbd6c37ec99406b5d69.png)
jinfo后面跟jps打出来的java进程后,可以显示某一进程的Java System Properties(环境变量)和VM Flags(虚拟机参数)。有时候想确认线上环境的参数是否和预期的一致,可以使用该命令,该命令还可以动态配置参数。
jmap
![45b511897a0fa37a43557ebb6a9c6fe6.png](https://img-blog.csdnimg.cn/img_convert/45b511897a0fa37a43557ebb6a9c6fe6.png)
jmap主要使用来生成dump文件
jmap -dump:live,format=b,file=heap.hprof 6268 ,生成dump文件我们可以使用eclipse的MAT,jdk自带的jvisualvm分析内存泄露和内存溢出问题。
当然也可以使用jhat命令查看dump文件
jstat
jstat命令用来监控指定进程的GC回收情况
![a91469528579a9ca8c0987d9dea1636c.png](https://img-blog.csdnimg.cn/img_convert/a91469528579a9ca8c0987d9dea1636c.png)
可以看每隔一秒就会打印出Java进程内各部分内存的使用量,下面是符号代表的意思:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比S0C:S0当前容量的大小S0U:S0已经使用的大小S1 — Heap上的 Survivor space 1 区已使用空间的百分比S1C:S1当前容量的大小S1U:S1已经使用的大小E — Heap上的 Eden space 区已使用空间的百分比EC:Eden space当前容量的大小EU:Eden space已经使用的大小O — Heap上的 Old space 区已使用空间的百分比OC:Old space当前容量的大小OU:Old space已经使用的大小P — Perm space 区已使用空间的百分比PC:Perm space当前容量的大小PU:Perm space已经使用的大小YGC — 从应用程序启动到采样时发生 Young GC 的次数YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)FGC — 从应用程序启动到采样时发生 Full GC 的次数FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
jstack
jstack是非常有用的命令,可以查看Java进程中每一个线程的工作状态,以及每个线程栈当前的方法执行顺序。可以帮助我们定位死锁,死循环等问题。
![228a4f14489e3973bd3d68742f1cfbb0.png](https://img-blog.csdnimg.cn/img_convert/228a4f14489e3973bd3d68742f1cfbb0.png)
图中依次可以看到线程名称mian,线程优先级prio, 线程tid,线程对应的本地线程nid,线程状态,(线程占用内存),下面可以看到当前正在调用的类名,方法名,源文件以及源文件行号。
这里要明白线程有几种状态,以及执行什么代码会出现什么状态。
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞 一般都是在等待锁。线程0获取到锁RUNNABLE状态,线程1则处于BLOCKED状态等待锁
![e4e5d39f04f5282c85a06ec9aa74e4fe.png](https://img-blog.csdnimg.cn/img_convert/e4e5d39f04f5282c85a06ec9aa74e4fe.png)
3、WAITING,线程正在等待被唤醒 wait()
![b95746df73c0da3733c7c06857dc361b.png](https://img-blog.csdnimg.cn/img_convert/b95746df73c0da3733c7c06857dc361b.png)
4、TIME_WAITING,线程等待一定时间唤醒 wait(time) sleep(time)
![df8722a22b2f217fccb263427883fe0e.png](https://img-blog.csdnimg.cn/img_convert/df8722a22b2f217fccb263427883fe0e.png)
一般定为问题,都是会连续执行几次jstack,这样就可以对比线程的状态,来明确线程的执行情况,从而定位问题所在。
总结
上面就是JVM常用的几个命令了。一般定位线上问题还需要看主机的磁盘、CPU、内存等综合判断问题所在,涉及网络请求的问题抓包也是常见手段,还有线上日志也很重要。
线上如果出现问题的话,应该快速恢复业务,在恢复业务之前搜集好定位问题所需要的信息。
希望对大家有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享架构和Java的文章,谢谢!