Bootstrap

高级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
      
      jps -q
      
      输出当前系统上所有Java进程的PID。

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
    
    jmap -dump:live,format=b,file=heapdump.hprof <pid>
    
    生成指定Java进程的heap dump文件,文件名为heapdump.hprof。

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() {
        // 测试代码
    }
    

二、注意事项

  1. 命令使用前提:需要知道目标Java进程的PID。
  2. 权限问题:某些命令可能需要管理员权限才能执行。
  3. 命令版本:不同版本的JDK可能提供的命令和参数有所不同,建议查阅官方文档以获取最准确的信息。
;