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


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

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

    jps

    功能

    jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其pid号。 jps相当于Solaris进程工具ps。不象"pgrep java"或"ps -ef grep java",jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。

    常用指令

    jps:显示当前用户的所有java进程的PID

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

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

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

    jinfo

    功能

    jinfo可以输出java进程、core文件或远程debug服务器的配置信息。这些配置信息包括JAVA系统参数及命令行参数,如果进程运行在64位虚拟机上,需要指明-J-d64参数,如:jinfo -J-d64 -sysprops pid

    jdk8中已经不支持该命令。

    常用指令

    jinfo -flag CMSIniniatingOccupancyFration 3331:查询CMSIniniatingOccupancyFration参数值

    jstat

    功能

    jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

    常用指令

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

    jstat -gccause:额外输出上次GC原因

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

    jmap

    功能

    jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成堆转储快照(Heap Dump)。

    常用指令

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

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

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

    jmap -dump:format=b,file=heapDump 3331:将内存使用的详细情况输出到文件,之后一般使用其他工具进行分析。

    jhat

    功能

    jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。使用jmap命令可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。

    由于有很多可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)可以替代,所以很少用。不过在没有可视化工具的机器上也是可用的。

    常用指令

    jmap -dump:format=b,file=heapDump 3331
    

    jhat heapDump:解析Java堆转储文件,并启动一个 web server

    jstack

    功能

    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

    jstack命令主要用来查看Java线程调用堆栈的,可以用来分析线程问题(如死锁)。

    常用指令

    jstack 3331:查看线程情况

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

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

    常见问题定位过程

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

    一、使用jps查看线程ID

    二、使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。

    三、使用jstat -gccause:额外输出上次GC原因

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

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

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

    死锁问题

    一、使用jps查看线程ID

    二、使用 jstack pid 查看线程情况

    结语

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

  • 相关阅读:
    struts2基础
    hibernate框架基础
    Django的模板层
    HBuilder无法连接夜神模拟器的解决办法
    Django的视图层
    Django的路由层
    Django简介
    http协议
    web应用
    Mongodb之增删改查
  • 原文地址:https://www.cnblogs.com/kyoner/p/11376624.html
Copyright © 2020-2023  润新知