Java开发必须掌握的线上问题排查命令

做为一个合格的开发人员,不只要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不单单是在coding的过程当中debug等,还包括的就是线上问题的排查。因为在生产环境中,通常没办法debug(其实有些问题,debug也白扯。。。),因此咱们须要借助一些经常使用命令来查看运行时的具体状况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用状况、GC状况、JVM参数状况、线程状况等。java

给一个系统定位问题的时候,知识、经验是关键,数据是依据,工具是运用知识处理数据的手段。为了便于咱们排查和解决问题,Sun公司为咱们提供了一些经常使用命令。这些命令通常都是jdk/lib/tools.jar中类库的一层薄包装。随着JVM的安装一块儿被安装到机器中,在bin目录中。下面就来认识一下这些命令以及具体使用方式web

 

jps

功能

显示当前全部java进程pid的命令。函数

经常使用指令

jps:显示当前用户的全部java进程的PID工具

jps -v 3331:显示虚拟机参数线程

jps -m 3331:显示传递给main()函数的参数debug

jps -l 3331:显示主类的全路径日志

详细介绍


jinfo

功能

实时查看和调整虚拟机参数,能够显示未被显示指定的参数的默认值(jps -v 则不能)。code

jdk8中已经不支持该命令。orm

经常使用指令

jinfo -flag CMSIniniatingOccupancyFration 1444:查询CMSIniniatingOccupancyFration参数值server

详细介绍


jstat

功能

显示进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

经常使用指令

jstat -gc 3331 250 20 :查询进程2764的垃圾收集状况,每250毫秒查询一次,一共查询20次。

jstat -gccause:额外输出上次GC缘由

jstat -calss:件事类装载、类卸载、总空间以及所消耗的时间

详细介绍


jmap

功能

生成堆转储快照(heapdump)

经常使用指令

jmap -heap 3331:查看java 堆(heap)使用状况

jmap -histo 3331:查看堆内存(histogram)中的对象数量及大小

jmap -histo:live 3331:JVM会先触发gc,而后再统计信息

jmap -dump:format=b,file=heapDump 3331:将内存使用的详细状况输出到文件,以后通常使用其余工具进行分析。

详细介绍


jhat

功能

通常与jmap搭配使用,用来分析jmap生成的堆转储文件。

因为有不少可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)能够替代,因此不多用。不过在没有可视化工具的机器上也是可用的。

经常使用指令

jmap -dump:format=b,file=heapDump 3331 + jhat heapDump:解析Java堆转储文件,并启动一个 web server

详细介绍


jstack

功能

生成当前时刻的线程快照。

经常使用指令

jstack 3331:查看线程状况

jstack -F 3331:正常输出不被响应时,使用该指令

jstack -l 3331:除堆栈外,显示关于锁的附件信息

详细介绍


常见问题定位过程

频繁GC问题或内存溢出问题

1、使用jps查看线程ID

2、使用jstat -gc 3331 250 20 查看gc状况,通常比较关注PERM区的状况,查看GC的增加状况。

3、使用jstat -gccause:额外输出上次GC缘由

4、使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

5、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆状况。

6、结合代码解决内存溢出或泄露问题。


死锁问题

1、使用jps查看线程ID

2、使用jstack 3331:查看线程状况

结语

常常使用适当的虚拟机监控和分析工具能够加快咱们分析数据、定位解决问题的速度,但也要知道,工具永远都是知识技能的一层包装,没有什么工具是包治百病的。

 

转自:https://www.hollischuang.com/archives/1561

相关文章
相关标签/搜索