高级java每日一道面试题-2024年11月28日-JVM篇-调优命令有哪些?
如果有遗漏,评论区告诉我进行补充
面试官: 调优命令有哪些?
我回答:
在Java高级面试中,调优命令是面试官常问的问题之一。以下是对Java调优命令的详细介绍:
一、主要调优命令
1. jps(JVM Process Status Tool)
- 功能:显示指定系统内所有的HotSpot虚拟机进程。
- 常用参数:
-q
:简洁模式,只输出Java虚拟机(JVM)的进程ID(PID),不显示主类名称或者其他详细信息。-l
:显示应用程序主类的完整包名或jar文件的完整路径。-v
:显示传递给JVM的参数。-m
:输出运行主类(即包含main方法的类)时传递给main方法的参数。- 示例:
jps -lvm
输出当前系统上所有Java进程的PID。jps -q
2. jstat(JVM statistics Monitoring)
- 功能:用于监视虚拟机运行时状态信息的命令,可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
- 常用参数:
-
jstat -gc <pid> [interval] [count]
:显示GC(Garbage Collection)统计信息,包括各代堆内存的大小、已用空间、已分配对象数以及GC次数与时间等。 -
jstat -class <pid>
:显示类加载器相关的统计信息,比如已加载的类数量及其占用的空间。 -
jstat -thread <pid>
:显示有关Java线程的信息,如活动线程数、死锁检测等。 -
jstat -gccapacity <pid>
:显示各个分代区域的容量配置。 -
jstat -gcutil <pid>
:提供更详细的GC使用率信息,包括堆区的使用率和永久代(或元空间)的使用情况。 -
示例:
jstat -gc 12345 1000 5
每隔1000毫秒打印一次PID为12345的进程的垃圾回收信息,共打印5次。
jstat -gc <pid> 1000 5
每隔1000毫秒查询一次Java进程的GC情况,共查询5次。
-
3. jmap(JVM Memory Map)
- 用途:生成堆转储快照(heap dump),或者查看堆内存的详细使用情况。
- 常用选项:
jmap -heap <pid>
:显示堆配置和使用情况。jmap -histo <pid>
:显示堆中的对象直方图。jmap -dump:live,format=b,file=heapdump.hprof <pid>
:生成堆转储文件。
- 示例:
jmap -heap 12345
生成指定Java进程的heap dump文件,文件名为heapdump.hprof。jmap -dump:live,format=b,file=heapdump.hprof <pid>
4. jhat(JVM Heap Analysis Tool)
- 功能:与jmap搭配使用,用来分析jmap生成的dump。jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。
jhat heapdump.hprof
分析heapdump.hprof文件,并在浏览器中查看分析结果。
5. jstack
- 功能:用于生成Java虚拟机当前时刻的线程快照,从而展示JVM当前线程的总体情况。如果Java进程启用了远程调试,jstack可以连接到远程主机上的调试端口来获取线程堆栈信息。
-
常用选项:
jstack <pid>
:显示指定进程的线程堆栈信息。jstack -l <pid>
:显示详细的线程信息,包括锁信息。
-
示例:
jstack 12345
jstack -l <pid>
生成指定Java进程的线程快照,并包含锁定信息。
6. jinfo
-
功能:JVM Configuration info,实时查看和调整虚拟机运行参数。
- 常用选项:jinfo <pid>
:显示进程的配置信息。jinfo -flag <name> <pid>
:显示特定JVM标志的值。jinfo -flag <name>=<value> <pid>
:设置特定JVM标志的值。
- **示例**:
```sh
jinfo 12345
```
7. jcmd (Java Command)
-
用途:向正在运行的Java进程发送诊断命令请求。
-
常用选项:
jcmd <pid> GC.run
:触发垃圾回收。jcmd <pid> GC.class_histogram
:显示类直方图。jcmd <pid> VM.version
:显示JVM版本信息。
-
示例:
jcmd 12345 GC.run
jinfo -flag MaxHeapSize <pid>
查询指定Java进程的MaxHeapSize参数值。
8. VisualVM
- 用途:一个图形化的工具,可以监控和分析Java应用程序的性能。
- 功能:
- 实时监控CPU、内存、线程等。
- 生成和分析堆转储。
- 分析线程堆栈。
- 监控JMX MBeans。
- 安装:
VisualVM通常包含在JDK的bin目录下,可以直接运行jvisualvm
命令启动。
9. JConsole
- 用途:一个图形化的工具,可以监控和管理Java应用程序。
- 功能:
- 实时监控内存、线程、类加载等。
- 查看MBeans。
- 启动:
可以通过jconsole
命令启动。
10. JFR (Java Flight Recorder)
-
用途:记录Java应用程序的低开销数据,用于事后分析。
-
功能:
- 记录各种事件,如垃圾回收、线程活动、JVM状态等。
- 与JMC(Java Mission Control)配合使用进行分析。
-
启用:
通过JVM参数启用,例如:-XX:StartFlightRecording=filename=myrecording.jfr
11. JMH (Java Microbenchmark Harness)
-
用途:用于编写和运行微基准测试。
-
功能:
- 提供精确的性能测量。
- 支持多种基准测试模式。
-
示例:
@Benchmark public void testMethod() { // 测试代码 }
二、注意事项
- 命令使用前提:需要知道目标Java进程的PID。
- 权限问题:某些命令可能需要管理员权限才能执行。
- 命令版本:不同版本的JDK可能提供的命令和参数有所不同,建议查阅官方文档以获取最准确的信息。