天天看點

Java線程監控之jvisualvm

線程的五種狀态

  • 建立:new
  • 運作:runnable
  • 等待:waitting(無限期等待),timed waitting(限期等待)
  • 阻塞:blocked
  • 結束:terminated
    線程轉換關系
               
Java線程監控之jvisualvm

線程的兩種監控方法

1、圖形界面的方式:jvisualvm

  • 監控之前先對jvm加監控參數,在tomcat的bin目錄下,catalina.sh檔案中,第二行添加:
#!/bin/sh
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=8080(開啟監控的端口,随意,未被占用即可) -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.30(Tomcat機器的IP)"
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
           

1-改port,監控的端口,未被占用即可

2-改hostname為本機ip

3-自然換行,不需要手動回車

如果想要監控和多個tomcat,則需要在每一個tomcat下都添加這行參數,且端口号不重複
  • 儲存并重新開機tomcat

檢視10086的程序是否存在:

netstat -an|grep 10086

或者檢視10086的使用詳情:

lsof -i:10086

準備就緒,下面開始監控tomcat的線程

1、win系統控制台輸入 jvisualvm 啟動JAVA Visualvm

Java線程監控之jvisualvm

2、下面我的tomcat安裝在本機上

Java線程監控之jvisualvm

2、指令行方式:jstack pid(程序号)

  • 該指令一般在Tomcat機器上執行
步驟
PS D:\MyData\Desktop> jstack 8743
2021-09-15 11:17:06
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.281-b09 mixed mode):

"RMI TCP Connection(8)-10.73.46.35" #76 daemon prio=5 os_prio=0 tid=0x0000016799055800 nid=0x8f50 runnable [0x000000189dcfe000]
   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 java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        - locked <0x00000006c4683a60> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(FilterInputStream.java:83)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$3/819083873.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

"http-nio-8080-exec-24" #71 daemon prio=5 os_prio=0 tid=0x000001679905a000 nid=0x61e8 waiting for monitor entry [0x00000018a10fb000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.io.PrintStream.println(PrintStream.java:806)
        - waiting to lock <0x00000006c2249ec8> (a java.io.PrintStream)
        at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:267)
        at cn.itcast.oa.util.HqlHelper.buildPageBeanForStruts2(HqlHelper.java:151)
        at cn.itcast.oa.view.action.UserAction.list(UserAction.java:33)
		...
		...
           
  • 就可以将指令傳回的資料在目前目錄下生成一個a.log檔案,友善檢視
    Java線程監控之jvisualvm