1、javap

使用 javap 可以查看 Java 字节码反编译的源文件

java visualvm查看线程数_Java


示例:

public class Test{
    public static void main(String []args) {
       System.out.println("Hello World");
    }
}

javap -c Test.class

public class Test{
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
 
  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

2、jps

jps查询当前所有java进程

java visualvm查看线程数_java visualvm查看线程数_02

java visualvm查看线程数_java visualvm查看线程数_03


java visualvm查看线程数_面试_04

3、jstat

jstat 主要用于监控JVM信息状态,主要是 GC 信息

java visualvm查看线程数_Java_05


jstat -gc 11600 来查看该进程的 GC 信息

java visualvm查看线程数_java_06


参数含义

  • S0C 表示当前 Survivor0 的容量,S1C 表示当前 Survivor1 的容量
  • S0U 表示当前 Survivor0 的利用率,S1U 表示当前 Survivor1 的利用率
  • EC 表示 Eden 的容量,EU 表示 Eden 的利用率
  • OC 表示老年代的容量,OU 表示老年代的利用率
  • MC 表示 Metaspace 的容量,MU 表示 Metaspace 的利用率
  • CCSC 表示类指针压缩空间容量,CCSU 表示使用的类指针压缩空间
  • YGC 表示新生代 GC 的次数,YGCT 表示新生代 GC 的时间
  • FGC 表示 Full Gc 的次数,FGCT 表示 Full GC 的时间
  • GCT 表示 GC 总时间。

每个对象都有一个指向它自身类的指针,_klass: 指向类的 4 字节指针,64 位平台上 _klass: 指向类的 8 字节的指针,为了节约这些空间,引入了类指针压缩空间。

3、jcmd

jcmd 可以查看 JVM 信息

java visualvm查看线程数_java_07

jcmd pit Thread.print -l 打印指定java进程在jvm中的所有线程栈

java visualvm查看线程数_Java_08


jcmd 11600 GC.heap_dump ./dump.hprof 指定目录文件生成当前java进程的 堆内存dump,map映射信息

java visualvm查看线程数_java visualvm查看线程数_09


java visualvm查看线程数_java_10

更多命令 通过jcmd pid help 查看

java visualvm查看线程数_java_11

4、jmap

jmap 打印出 Java 进程内存中 Object 的情况

java visualvm查看线程数_Java_12

jmap 一般是用来导出 内存dump的,命令参考 Example: jmap -dump:live,format=b,file=heap.bin

实际上新版的输入是这样的

[root@admin ~]# jmap --help
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

常用的 options 参数:

  • heap 显示 Java 堆详细信息
  • histo 显示堆中对象的统计信息
  • permstat 显示堆永久区的类加载器的统计信息
  • finalizerinfo 显示在 F-Queue 队列等待 Finalizer 线程执行 finalize 方法的对象
  • dump 生成堆转储快照

5、jhat

jhat 分析 Java 堆的命令,可以将堆中对象以 html 的形式显示出来

java visualvm查看线程数_jvm_13

没怎么用过

6、jstack

jstack 是堆栈跟踪工具,主要用于打印给定进程 pid 的堆栈信息,一般在发生死锁或者 CPU 100% 的时候排查问题使用,可以去查询当前运行的线程以及线程的堆栈信息是什么情况

java visualvm查看线程数_jvm_14


将指定java进程在jvm中的线程栈 全部打印,追加到文件中

java visualvm查看线程数_Java_15

java visualvm查看线程数_Java_16