原创

JVM实战(6)——工具篇: 命令行工具

温馨提示:
本文最后更新于 2023年07月19日,已超过 335 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

本篇我们来熟悉下一些JVM实战中会涉及到的一些命令行工具,这里面有的是JDK本身内置的工具,有些则是linux常用的一些命令,但本章只会介绍这些工具基本的功能作用以及使用场景,不会对工具或命令中涉及的各方面做讲解,如果想了解更深入的内容,建议查看命令对应的官方文档。

一、PID查看——jps

  • 功能:jps命令用于查看Java进程的进程ID(PID)。
  • 使用场景:常用于查找正在运行的Java进程,特别是在多个Java进程同时运行的情况下。
  • 常用参数

   -q:只显示进程ID,不显示类名、JAR文件名等其他信息。

   -m:显示传递给主类main()方法的参数。

   -l:显示完整的进程启动命令。

  • 常用命令样例

   - jps:显示正在运行的Java进程的PID和类名。

   - jps -m:显示Java进程的PID、类名和传递给主类main()方法的参数。

   - jps -l:显示Java进程的PID和完整的进程启动命令。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 如果没有权限查看其他用户的进程信息,可以使用sudo权限或在root用户下执行。

 

二、JVM详情查看——jinfo

  • 功能:jinfo命令用于获取Java进程的详细信息,包括系统属性、JVM参数等。
  • 使用场景:常用于查看Java进程的启动参数、系统属性等信息,以及动态修改JVM参数。
  • 常用参数

   -flag <name>:显示指定JVM参数的值。

   -flags:显示所有的JVM参数及其值。

   -sysprops:显示Java进程的系统属性。

  • 常用命令样例

   - jinfo <pid>:显示Java进程的启动参数和系统属性。

   - jinfo -flags <pid>:显示Java进程的所有JVM参数及其值。

   - jinfo -flag MaxHeapSize <pid>:显示Java进程的最大堆大小参数值。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 需要指定Java进程的PID作为参数。

   - 修改JVM参数时需要谨慎,错误的参数配置可能导致程序异常或性能问题。

 

三、线程栈信息查看——jstack

  • 功能:jstack命令用于生成Java进程的线程栈信息,包括线程状态、调用栈、锁信息等。
  • 使用场景:常用于查找Java进程的线程问题,如死锁、死循环、线程阻塞等。
  • 常用参数

   -l:生成关于锁的附加信息。

   -m:生成混合模式栈,显示C/C++框架调用的调用栈。

  • 常用命令样例

   - jstack <pid>:生成Java进程的线程栈信息。

   - jstack -l <pid>:生成Java进程的线程栈信息,并显示关于锁的附加信息。

   - jstack -m <pid>:生成Java进程的线程栈信息,包括C/C++框架调用的调用栈。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 需要指定Java进程的PID作为参数。

   - 线程栈信息可以帮助分析和解决线程相关的问题,但需要有一定的线程调试和分析经验。

 

四、内存信息查看——jmap

  • 功能:jmap命令用于生成Java进程的内存快照,包括堆内存、非堆内存、对象统计等信息。
  • 使用场景:常用于分析Java进程的内存使用情况,如内存泄漏、大对象等问题。
  • 常用参数

   -heap:显示堆内存使用情况。

   -histo[:live]:显示对象统计信息,可选择只统计存活对象。

   -dump:format=b,file=<filename>:生成内存快照到指定文件。

  • 常用命令样例

   - jmap -heap <pid>:显示Java进程的堆内存使用情况。

   - jmap -histo <pid>:显示Java进程的对象统计信息。

   - jmap -dump:format=b,file=dump.bin <pid>:生成Java进程的内存快照到文件dump.bin。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 需要指定Java进程的PID作为参数。

   - 生成内存快照可能会对Java进程的性能产生影响,尽量在非生产环境下使用。

 

五、GC信息查看——jstat

  • 功能:jstat命令用于监视Java进程的GC(垃圾回收)情况,包括堆内存使用、GC次数、GC时间等。
  • 使用场景:常用于实时监控Java进程的GC情况,帮助分析和调优垃圾回收性能。
  • 常用参数

   -gc:显示GC相关信息。

   -gccapacity:显示堆内存容量。

   -gcutil:显示GC的统计信息。

  • 常用命令样例

   - jstat -gc <pid>:显示Java进程的GC相关信息。

   - jstat -gccapacity <pid>:显示Java进程的堆内存容量。

   - jstat -gcutil <pid>:显示Java进程的GC的统计信息。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 需要指定Java进程的PID作为参数。

   - 实时监控GC信息时可以指定时间间隔,如jstat -gc <pid> 1000表示每秒输出一次GC信息。

 

六、发送诊断命令到JVM——jcmd

  • 功能:jcmd命令用于向正在运行的Java进程发送诊断命令,如线程转储、堆转储、GC执行等。
  • 使用场景:常用于对Java进程进行动态诊断和调试,获取更详细的运行时信息。
  • 常用参数

   -l:列出正在运行的Java进程及其对应的PID。

   <PID> <command>:发送指定的诊断命令到指定的Java进程。

  • 常用命令样例

   - jcmd:列出正在运行的Java进程及其对应的PID。

   - jcmd <pid> help:显示指定Java进程支持的诊断命令列表。

   - jcmd <pid> Thread.print:打印Java进程的线程信息。

  • 注意事项

   - 需要在JDK的bin目录下执行该命令。

   - 需要指定Java进程的PID作为参数。

   - 不同版本的JDK可能支持不同的诊断命令,使用时需查阅相关文档或使用help命令查看支持的命令。

 

七、其他命令

7.1 top

  •    功能:top命令用于实时查看系统的进程状态和性能指标。
  •    使用场景:常用于监控系统的进程状态、CPU使用率、内存使用等信息。
  •    常用参数:常用的参数有"-d"指定刷新间隔时间、"-p"指定进程ID等。
  •    常用命令样例toptop -d 1top -p <pid>
  •    注意事项:top命令会实时更新信息,按"q"键退出。

   

7.2 grep

  •    功能:grep命令用于在文本中查找匹配的行。
  •    使用场景:常用于在文件或命令输出中查找特定的字符串。
  •    常用参数:常用的参数有"-i"忽略大小写、"-r"递归查找等。更多参数如

-i -- 大小写不区分

-l -- 只显示文件名称

-h -- 不显示文件名称

-c -- 匹配的行有多少行

-v -- 取反

-q -- 不显示任何信息

-n -- 显示行号

-o -- 只显示匹配的单词,不显示整行

-r -- 递归

-E -- 扩展正则表达式

  •    常用命令样例grep "keyword" file.txtcommand | grep "pattern"

查找/etc conf文件中不以#号开头:

find /etc/services |grep -v ^#

查找etc目录下以conf结尾的文件,如果包含linux,就输出文件名称:

grep -i linux `find /etc/ -name "*conf"`

grep -i linux `find /etc/ -name "*conf"` | xargs cat

grep -li linux `find /etc/ -name "*conf"` |xargs cat |wc -l

  •    注意事项:grep命令区分大小写,使用"-i"参数可忽略大小写。

 

7.3 ps

  •    功能:ps命令用于查看系统的进程状态。
  •    使用场景:常用于列出当前用户的进程或指定用户的进程。
  •    常用参数:常用的参数有"-e"显示所有进程、"-u"指定用户等。
  •    常用命令样例psps -efps -u username
  •    注意事项:ps命令可以根据不同操作系统有不同的用法和参数。

 

7.4 find

  •    功能:find命令用于在指定目录中查找文件或目录。
  •    使用场景:常用于按照文件名、文件类型等条件查找文件。
  •    常用参数:常用的参数有"-name"按照文件名查找、"-type"按照文件类型查找等。
  •    常用命令样例find /path -name "filename"find /path -type d
  •    注意事项:find命令会递归查找指定目录及其子目录中的文件。

 

7.5 lsof

  •    功能:lsof命令用于列出打开的文件和网络连接。
  •    使用场景:常用于查看某个进程打开的文件、网络连接等信息。
  •    常用参数:常用的参数有"-i"列出网络连接、"-p"指定进程ID等。
  •    常用命令样例lsof -i TCP:80lsof -p <pid>
  •    注意事项:lsof命令需要root权限或使用sudo才能查看所有进程的信息。

 

7.6 head 和 tail

  •    功能:head命令用于显示文件的前几行,tail命令用于显示文件的后几行。
  •    使用场景:常用于查看大文件的头部或尾部内容。
  •    常用参数:常用的参数有"-n"指定显示的行数等。
  •    常用命令样例head -n 10 file.txttail -n 20 file.txt
  •    注意事项:head和tail命令默认显示文件的前/后10行,可以使用"-n"参数指定显示的行数。

7.7 gzip和tar的压缩与解压

  • gzip的压缩:gzip spring.log.2023-0*

  • gzip的解压:gzip -d *.gz

  • tar的打包:tar -cvf spring.log.tar spring.log.2023-0*

  • tar的解包:tar -xvf spring.log.tar

  • tar的带压缩的打包:tar -zcvf spring.log.tar.gz spring.log.2023-0*

  • tar的带压缩的解包:tar -zxvf spring.log.tar.gz

7.8 常用命令联合使用:

  1. 查看命令进程:ps -ef|grep app
  2. 查找带有指定内容的文件:find ./ -name "spring.log.*" |xargs grep "5957002988355837953"

通过对上述JVM和Linux常用命令的讲解,可以更好地理解它们的功能、使用场景、常用参数和样例,以及使用时的注意事项。这些命令在诊断和调优Java进程、监控系统状态等方面都起到了重要的作用,对于开发人员和系统管理员来说是非常有价值的工具。

正文到此结束
本文目录