Java虚拟机常用性能监控和故障处理工具

1.jps:虚拟机进程状况工具

JDK的很多小工具的名字都参考了UNIX命令的命名方式,jps(JVM Process Status Tool)是其中 的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进 程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一 ID(LVMID,Local Virtual Machine Identifier)。虽然功能比较单一,但它绝对是使用频率最高的JDK 命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进 程。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的,使 用Windows的任务管理器或者UNIX的ps命令也可以查询到虚拟机进程的LVMID,但如果同时启动了 多个虚拟机进程,无法根据进程名称定位时,那就必须依赖jps命令显示主类的功能才能区分了。

public class JavaVMStackOOM {
    private void dontStop() {
        while (true) {
        }
    }

    public void stackLeakByThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                dontStop();
            }
        });
        thread.start();
    }

    public static void main(String[] args) {
        JavaVMStackOOM javaVMStackOOM = new JavaVMStackOOM();
        javaVMStackOOM.stackLeakByThread();
        System.out.println(System.getProperties());
    }
}

启动上边测试程序查看进程状态
在这里插入图片描述
在这里插入图片描述

2. jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可 以显示本地或者远程[1]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有 GUI图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。
还是进行如上程序查询
在这里插入图片描述表4-2 jstat工具主要选项
在这里插入图片描述在这里插入图片描述
还有一个样例数据
在这里插入图片描述
查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了6.2%的空间,2个Survivor区 (S0、S1,表示Survivor0、Survivor1)里面都是空的,老年代(O,表示Old)和永久代(P,表示 Permanent)则分别使用了41.42%和47.20%的空间。程序运行以来共发生Minor GC(YGC,表示Young GC)16次,总耗时0.105秒;发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GC Time)为0.472秒;所有GC总耗时(GCT,表示GC Time)为0.577秒。

3.jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。使用jps命令的-v参 数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除 了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 6或以上版本的话,使用java- XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)。jinfo还可以使用-sysprops选项把虚拟机 进程的System.getProperties()的内容打印出来。这个命令在JDK 5时期已经随着Linux版的JDK发布,当 时只提供了信息查询的功能,JDK 6之后,jinfo在Windows和Linux平台都有提供,并且加入了在运行期 修改部分参数值的能力(可以使用-flag[+|-]name或者-flag name=value在运行期修改一部分运行期可写的 虚拟机参数值)。在JDK 6中,jinfo对于Windows平台功能仍然有较大限制,只提供了最基本的-flag选 项。

C:\Users\ADMIN>jinfo 18948
Java System Properties:
#Mon Mar 07 15:13:43 CST 2022
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\bin
java.vm.version=25.311-b11
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D\:\\IdeaProject\\ScalaDemo2
java.runtime.version=1.8.0_311-b11
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\endorsed
os.arch=amd64
java.io.tmpdir=C\:\\Users\\ADMIN\\AppData\\Local\\Temp\\
line.separator=\r\n
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.library.path=C\:\\Program Files\\Java\\jdk1.8.0_311\\bin;C\:\\Windows\\Sun\\Java\\bin;C\:\\Windows\\system32;C\:\\Windows;C\:\\Program Files\\Common Files\\Oracle\\Java\\javapath;C\:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Windows\\System32\\OpenSSH\\;C\:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C\:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;D\:\\jdk\\JDK11\\bin;D\:\\jdk\\JDK11\\jre\\bin;D\:\\Git\\Git\\cmd;D\:\\Git\\Git\\cmd;D\:\\sdk\\tools;D\:\\sdk\\platform-tools;C\:\\Program Files\\Docker\\Docker\\resources\\bin;C\:\\ProgramData\\DockerDesktop\\version-bin;D\:\\openssl\\openssl-0.9.8k_X64\\bin;D\:\\NodeJS\\;D\:\\Appium\\Appium\\node_modules\\.bin;D\:\\Appium\\Appium;D\:\\flutter\\fluttersdk\\flutter\\bin;D\:\\Scala\\Scala;D\:\\Mysql\\mysql-8.0.28-winx64\\bin;D\:\\Cygwin\\bin;D\:\\FreeType\\freetype-2.10.1\\freetype-2.10.1\\include;D\:\\FreeType\\freetype-2.10.1\\freetype-2.10.1\\lib;C\:\\Users\\ADMIN\\AppData\\Local\\Microsoft\\WindowsApps;C\:\\Users\\ADMIN\\AppData\\Roaming\\npm;C\:\\Users\\ADMIN\\AppData\\Local\\Coursier\\data\\bin;.
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C\:\\Users\\ADMIN
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.class.path=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\charsets.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\deploy.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\access-bridge-64.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\cldrdata.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\dnsns.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\jaccess.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\jfxrt.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\localedata.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\nashorn.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\sunec.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\sunjce_provider.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\sunmscapi.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\sunpkcs11.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext\\zipfs.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\javaws.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jce.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jfr.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jfxswt.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jsse.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\management-agent.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\plugin.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\resources.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\rt.jar;D\:\\IdeaProject\\ScalaDemo2\\out\\production\\ScalaDemo2;C\:\\Users\\ADMIN\\.ivy2\\cache\\org.scala-lang\\scala-library\\jars\\scala-library-2.13.8.jar;C\:\\Users\\ADMIN\\.ivy2\\cache\\org.scala-lang\\scala-reflect\\jars\\scala-reflect-2.13.8.jar;C\:\\Users\\ADMIN\\.ivy2\\cache\\org.scala-lang\\scala-library\\srcs\\scala-library-2.13.8-sources.jar;D\:\\idea\\IntelliJ IDEA 2021.1.3\\lib\\idea_rt.jar
user.name=ADMIN
java.vm.specification.version=1.8
sun.java.command=JavaVMStackOOM
java.home=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_311
java.ext.dirs=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\ext;C\:\\Windows\\Sun\\Java\\lib\\ext
sun.boot.class.path=C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\resources.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\rt.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\sunrsasign.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jsse.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jce.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\charsets.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\lib\\jfr.jar;C\:\\Program Files\\Java\\jdk1.8.0_311\\jre\\classes
java.vendor=Oracle Corporation
file.separator=\\
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.cpu.isalist=amd64

VM Flags:
-XX:CICompilerCount=3 -XX:InitialHeapSize=266338304 -XX:MaxHeapSize=4259315712 -XX:MaxNewSize=1419771904 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:ThreadStackSize=5120 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

VM Arguments:
jvm_args: -Xss5M -javaagent:D:\idea\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar=59028:D:\idea\IntelliJ IDEA 2021.1.3\bin -Dfile.encoding=UTF-8
java_command: JavaVMStackOOM
java_class_path (initial): C:\Program Files\Java\jdk1.8.0_311\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\rt.jar;D:\IdeaProject\ScalaDemo2\out\production\ScalaDemo2;C:\Users\ADMIN\.ivy2\cache\org.scala-lang\scala-library\jars\scala-library-2.13.8.jar;C:\Users\ADMIN\.ivy2\cache\org.scala-lang\scala-reflect\jars\scala-reflect-2.13.8.jar;C:\Users\ADMIN\.ivy2\cache\org.scala-lang\scala-library\srcs\scala-library-2.13.8-sources.jar;D:\idea\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar
Launcher Type: SUN_STANDARD

查询CMSInitiatingOccupancyFraction参数值

C:\Users\ADMIN>jinfo -flag CMSInitiatingOccupancyFraction 18948
-XX:CMSInitiatingOccupancyFraction=-1

4.jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如
果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴力”的手段:譬如在第2章中用过的-
XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储
快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快
照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转
储快照。
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的
详细信息,如空间使用率、当前用的是哪种收集器等。
和jinfo命令一样,jmap有部分功能在Windows平台下是受限的,除了生成堆转储快照的-dump选项
和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统中都可以使用之外,其余选项都
只能在Linux/Solaris中使用。
在这里插入图片描述
测试

C:\Users\ADMIN\Downloads>jmap -dump:format=b,file=dump.txt 18948
Heap dump file created

文件部分内容

4a41 5641 2050 524f 4649 4c45 2031 2e30
2e31 0000 0000 0800 0001 7f63 4c7d 5e01
0000 0000 0000 0015 0000 0210 faea 1b80
4d41 585f 534d 414c 4c5f 5445 4e01 0000
0000 0000 0011 0000 0210 f96a eab0 6a61
7661 2e6e 6574 2e01 0000 0000 0000 0031
0000 0210 f963 b000 284c 6a61 7661 2f75
7469 6c2f 5365 743c 5445 3b3e 3b4c 6a61
7661 2f6c 616e 672f 4f62 6a65 6374 3b29
5601 0000 0000 0000 0013 0000 0210 de6c
3e30 6c69 6e6b 4d65 7468 6f64 2001 0000
0000 0000 0013 0000 0210 fae1 b120 6c61
6e67 7461 6753 6574 7301 0000 0000 0000
001a 0000 0210 f96a 9860 7479 7065 2063
616e 2774 2062 6520 6e75 6c6c 0100 0000
0000 0000 1c00 0002 10f9 626d d069 7341
6c70 6861 4e75 6d65 7269 6353 7472 696e
6701 0000 0000 0000 0033 0000 0210 de6c
7970 284c 6a61 7661 2f6c 616e 672f 436c

5.jhat:虚拟机堆转储快照分析工具

JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。不过 实事求是地说,在实际工作中,除非手上真的没有别的工具可用,否则多数人是不会直接使用jhat命令 来分析堆转储快照文件的,主要原因有两个方面。一是一般不会在部署应用程序的服务器上直接分析 堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器[1]上进行分析,因为分析 工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,就没有必要再受命令行 工具的限制了。另外一个原因是jhat的分析功能相对来说比较简陋,后文将会介绍到的VisualVM,以 及专业用于分析堆转储快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer[2]等工具,都能实现 比jhat更强大专业的分析功能。代码清单4-3演示了使用jhat分析上一节采用jmap生成的Eclipse IDE的内 存快照文件。
由于我本地该命令不能使用,借用资料内容
使用jhat分析dump文件

jhat eclipse.bin 
Reading from eclipse.bin... 
Dump file created Fri Nov 19 22:07:21 CST 2010 
Snapshot read, resolving... 
Resolving 1225951 objects... 
Chasing references, expect 245 dots.... 
Eliminating duplicate references... 
Snapshot resolved. 
Started HTTP server on port 7000 
Server is ready. 

屏幕显示“Server is ready.”的提示后,用户在浏览器中输入http://localhost:7000/可以看到分析结
果,如图4-3所示。
分析结果默认以包为单位进行分组显示,分析内存泄漏问题主要会使用到其中的“Heap
Histogram”(与jmap-histo功能一样)与OQL页签的功能,前者可以找到内存中总容量最大的对象,后
者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计。如果读者需要了解具
体OQL的语法和使用方法
在这里插入图片描述

6.jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的 目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂 起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈, 就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
在这里插入图片描述
同样测试程序查询结果

C:\Users\ADMIN\Downloads>jstack -l 18948
2022-03-07 15:53:42
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.311-b11 mixed mode):

"DestroyJavaVM" #12 prio=5 os_prio=0 tid=0x00000210de654800 nid=0x5720 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Thread-0" #11 prio=5 os_prio=0 tid=0x00000210faf42000 nid=0x5910 runnable [0x000000ec26efe000]
   java.lang.Thread.State: RUNNABLE
        at JavaVMStackOOM.dontStop(JavaVMStackOOM.java:3)
        at JavaVMStackOOM.access$000(JavaVMStackOOM.java:1)
        at JavaVMStackOOM$1.run(JavaVMStackOOM.java:11)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x00000210faeb8800 nid=0x5584 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C1 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x00000210fae02000 nid=0x43b8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x00000210fadff800 nid=0x5820 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x00000210fadfb800 nid=0x581c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x00000210fadf4800 nid=0x4d74 runnable [0x000000ec260fe000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b91c250> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b91c250> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)

   Locked ownable synchronizers:
        - None

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000210f9649800 nid=0x36a8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000210f9649000 nid=0x5a7c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000210f961a000 nid=0x4a7c in Object.wait() [0x000000ec251fe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b608ee0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b608ee0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000210f960f800 nid=0x372c in Object.wait() [0x000000ec24cfe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b606c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b606c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
        - None

"VM Thread" os_prio=2 tid=0x00000210f95e8000 nid=0x4e4c runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000210de66b000 nid=0x55b0 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000210de66c800 nid=0x4fec runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000210de66d800 nid=0x5ad8 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000210de670000 nid=0x50f4 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000210de671000 nid=0x5b10 runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000210de674000 nid=0x5634 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x00000210faec5000 nid=0x293c waiting on condition

JNI global references: 12
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值