31 命令行

02 jps 查看正在运行的Java进程

  • jps (Java Process Status)
  • jps -q 只显示pid
  • jps -l 显示程序主类的全类名,如果执行的是jar,输出jar完整路径
  • jps -m 输出启动时,应用参数参数即传递给main函数参数
  • jps -v 列出虚拟机进程启动时JVM参数
  • JVM参数 -XX:-UsePerfData jps命令无法探知该java进程

03 jstat 查看JVM的统计信息

  • jstat (JVM Statistics Monitoring Tool) 显示本地或者远程虚拟机进程中的类装载、内在、垃圾收集、JIT编译等运行数据

    • 在没有GUI图形界面,只能提供纯文本控制台服务器上,其是运行定位虚拟机性能问题的首选工具
  • 参数

    ╰─➤  jstat -help                                                                                                                                                                     Usage: jstat --help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    Definitions:
      <option>      An option reported by the -options option
      <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                         <lvmid>[@<hostname>[:<port>]]
                    Where <lvmid> is the local vm identifier for the target
                    Java virtual machine, typically a process id; <hostname> is
                    the name of the host running the target Java virtual machine;
                    and <port> is the port number for the rmiregistry on the
                    target host. See the jvmstat documentation for a more complete
                    description of the Virtual Machine Identifier.
      <lines>       Number of samples between header lines.
      <interval>    Sampling interval. The following forms are allowed:
                        <n>["ms"|"s"]
                    Where <n> is an integer and the suffix specifies the units as
                    milliseconds("ms") or seconds("s"). The default units are "ms".
      <count>       Number of samples to take before terminating.
      -J<flag>      Pass <flag> directly to the runtime system.
      -? -h --help  Prints this help message.
      -help         Prints this help message.
    
  • jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

    • option 参数
    • interval 间隔时间
    • count 指定查询次数
    • -t 显示程序运行时间,单位秒
    • -h 可以在周期性数据输出时,输出多少行数据后输出一个表头信息
  • option

    • 类装载相关的
      • -class 显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等
    • 垃圾回收
      • -gc 显示与gc相关的堆信息,各区容量
      • -gccapacity,与-gc基本相同,但输出主要关注java堆各个区域使用的最大、最小空间
      • -gcutil: 与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
      • -gccause 导致最后一次或当前正在发生GC产生的原因
      • -gcnew 显示新生代GC状况
      • -gcnewcapacity 显示与-gcnew基本相同,主要关注使用的最大、最小空间
      • -gcold 显示老年代GC情况
      • -gcoldcapacity 显示-gcold基本相同,输出主要关注使用到的最大、最小空间

04 jinfo

  • jinfo (Configuration Info for Java)
    • 查看虚拟机配置参数信息,也可以调整虚拟机的配置信息

查看

  • jinfo -sysprops PID 可查看由System.getProperties()取得的参数

  • jinfo -flags PID 查看赋值的参数

  • jinfo -flag 具体参数 PID 查看某个参数的值

    ╰─➤  jinfo -flag UseG1GC 56499
    -XX:+UseG1GC
    ╰─➤  jinfo -flag MaxHeapSize 56499
    -XX:MaxHeapSize=2147483648
    

修改

可以修改被标记为manageable的可以被实时修改

  • java -XX:+PrintFlagsFinal -version | grep manageable
  • jinfo -flag +PrintFlagsFinal PID

拓展

  • java -XX:+PrintFlagInitial 查看所有JVM参数启动的初始值

  • java -XX:+PrintFlagsFinal 查看所有JVM参数的最终值

05 jmap 导出内存映像文件&内存使用情况

  • jmap (JVM Memory Map) 获取dump文件,获取目标java进程的内存信息

基本语法

  • jmap [option] [PID]
  • jmap [option] <executable> <core>
  • jmap [option] [server_id@]<remote server IP or hostname>

参数

  • -dump 生成java堆转储快照:dump文件
  • -heap 堆空间信息
  • -histo 堆中对象统计信息,包括类、实例数量和合计容量
    • -histo:live只统计堆中存活对象
  • -permstat 以classloader为统计口径,输出永久代的内存状态信息
  • -finalizerinfo 显示F-queue 队列待执行finalize方法的对象
  • -F
  • -j <flag>

导出内存映像文件/dump

  • 自动
    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:+HeapDumpBeforeFullGC
    • -XX:HeapDumpPath=<filename.hprof>
  • 手动
    • jmap -dump:format=b,file=<filename.hprof> PID
    • jmap -dump:live,format=b,file=<filename.hprof> PID 堆中存活对象

显示内存信息

  • jmap -heap PID (GraalVM 无效)
  • jmap -histo PID

06 jhat (JVM Heap Analysis Tool)

jhat与jmap搭配使用,用于分析jmap生成heap dump文件。jhat内置了一个微型HTTP/HTML服务器,生成dump文件分析结果。

http://localhost:7000/

jhat 在JDK9、JDK10中已经删除,官方建议用VisualVM

  • 命令:jmap -port 7001 2.hprof

07 jstack(JVM Stack Trace)

关注的状态

  • 死锁 Deadlock(重点关注)
  • 等待资源 Waiting on condition (重点关注)
  • 等待获取监视器 Waiting on monitor entry (重点关注)
  • 阻塞 Blocked(重点关注)
  • 执行中 Runnable
  • 暂停 Suspended
  • 对象等待中 Object.wait() 或 TIMED_WAITING
  • 停止 Parked

参数

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

jcmd

JDK1.7增加,多功能工具。

实现除jstat之外的所有命令功能。比如:导出堆、内存使用、查看Java进程、导出栈信息、GC、JVM运行时间

  • 命令参数
    • jcmd -l 列出所有jvm进程
    • jcmd 6316 help 针对指定进程,列出支持的所有命令
    • jcmd pid 具体指令 显示指定进程的指令命令数据
      • jcmd pid Thread.print

jstatd

配合jps、jstat远程监控

上次更新:
贡献者: NOHI