JVM实战(6)——工具篇: 命令行工具
本篇我们来熟悉下一些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等。 - 常用命令样例:
top
、top -d 1
、top -p <pid>
。 - 注意事项:top命令会实时更新信息,按"
q
"键退出。
7.2 grep
- 功能:grep命令用于在文本中查找匹配的行。
- 使用场景:常用于在文件或命令输出中查找特定的字符串。
- 常用参数:常用的参数有"
-i
"忽略大小写、"-r
"递归查找等。更多参数如
-i
-- 大小写不区分
-l
-- 只显示文件名称
-h
-- 不显示文件名称
-c
-- 匹配的行有多少行
-v
-- 取反
-q
-- 不显示任何信息
-n
-- 显示行号
-o
-- 只显示匹配的单词,不显示整行
-r
-- 递归
-E
-- 扩展正则表达式
- 常用命令样例:
grep "keyword" file.txt
、command | 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
"指定用户等。 - 常用命令样例:
ps
、ps -ef
、ps -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:80
、lsof -p <pid>
。 - 注意事项:lsof命令需要root权限或使用sudo才能查看所有进程的信息。
7.6 head 和 tail
- 功能:head命令用于显示文件的前几行,tail命令用于显示文件的后几行。
- 使用场景:常用于查看大文件的头部或尾部内容。
- 常用参数:常用的参数有"
-n
"指定显示的行数等。 - 常用命令样例:
head -n 10 file.txt
、tail -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 常用命令联合使用:
- 查看命令进程:
ps -ef|grep app
- 查找带有指定内容的文件:
find ./ -name "spring.log.*" |xargs grep "5957002988355837953"
通过对上述JVM和Linux常用命令的讲解,可以更好地理解它们的功能、使用场景、常用参数和样例,以及使用时的注意事项。这些命令在诊断和调优Java进程、监控系统状态等方面都起到了重要的作用,对于开发人员和系统管理员来说是非常有价值的工具。
- 本文标签: JVM 调优实战 理论基础
- 本文链接: https://www.v8en.com/article/330
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权