JDK性能調(diào)優(yōu)命令

1、環(huán)境

一個(gè)可運(yùn)行的java程序。本例選擇的是xboot (一個(gè)基于springboot 開發(fā)的后臺管理框架)附上地址。jdk版本:1.8
https://github.com/Exrick/xboot

2、命令

2.1 Jinfo

先用jps 命令查看應(yīng)用的進(jìn)程
C:\Users\lujw0>jps
1128 XbootApplication
14924 Jps
通過jps命令可以查出xboot 項(xiàng)目的進(jìn)程id是1128。

- 查看正在運(yùn)行的Java應(yīng)用程序的擴(kuò)展參數(shù)
C:\Users\lujw0>jinfo -flags 1128
Attaching to process ID 1128, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:+ManagementServer -XX:MaxHeapSize=2120220672 -XX:MaxNewSize=706740224 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:4099,suspend=y,server=n -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:C:\Users\lujw0\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8
上邊的這些參數(shù)下面會講,都是對jvm調(diào)優(yōu)配置的一些參數(shù)。

- 查看java 系統(tǒng)參數(shù)
C:\Users\lujw0>jinfo -sysprops 1128
Attaching to process ID 1128, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14
spring.output.ansi.enabled = always
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.102-b14
sun.boot.library.path = C:\Program Files\Java\jdk1.8.0_102\jre\bin
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = ;
java.rmi.server.randomIDs = true
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level =
sun.java.launcher = SUN_STANDARD
user.script =
user.country = CN
user.dir = F:\bdyhwork\wenda_bms
java.vm.specification.name = Java Virtual Machine Specification
PID = 1128
intellij.debug.agent = true
java.runtime.version = 1.8.0_102-b14
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = C:\Program Files\Java\jdk1.8.0_102\jre\lib\endorsed
line.separator =

java.io.tmpdir = C:\Users\lujw0\AppData\Local\Temp\
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_102\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\NetSarang\Xshell 6\;C:\Program Files (x86)\NetSarang\Xftp 6\;E:\soft\node\nodeinstall\;C:\windows\system32\;C:\Program Files\TortoiseGit\bin;C:\Program Files\Git\cmd;C:\Users\lujw0\AppData\Local\Android\sdk\platform-tools;C:\Users\lujw0\AppData\Local\Microsoft\WindowsApps;E:\soft\idea 2019\IntelliJ IDEA 2019.1\plugins\maven\lib\maven3\bin;E:\soft\Git\bin;E:\soft\Git\mingw32\libexec\git-core;C:\Users\lujw0\AppData\Roaming\npm;E:\soft\webstom\WebStorm 2019.2.1\bin;C:\Program Files\Java\jdk1.8.0_102\bin;C:\Program Files\Java\jdk1.8.0_102\jre\bin;.
spring.beaninfo.ignore = true
jboss.modules.system.pkgs = com.intellij.rt
java.class.version = 52.0
java.specification.name = Java Platform API Specification
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
spring.liveBeansView.mbeanDomain =
os.version = 10.0
user.home = C:\Users\lujw0
user.timezone = Asia/Shanghai
catalina.useNaming = false
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
catalina.home = C:\Users\lujw0\AppData\Local\Temp\tomcat.5173769956863843077.8888
user.name = bdzh01
java.class.path = C:\Users\lujw0\AppData\Local\Temp\classpath1301191800.jar;C:\Users\lujw0\.IntelliJIdea2019.1\system\captureAgent\debugger-agent.jar
com.sun.management.jmxremote =
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = cn.exrick.xboot.XbootApplication
java.home = C:\Program Files\Java\jdk1.8.0_102\jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode
java.version = 1.8.0_102
java.ext.dirs = C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path = C:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_102\jre\classes
java.awt.headless = true
java.vendor = Oracle Corporation
catalina.base = C:\Users\lujw0\AppData\Local\Temp\tomcat.5173769956863843077.8888
spring.application.admin.enabled = true
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

jinfo -sysprops 這個(gè)命令會更加詳細(xì)會打印出項(xiàng)目運(yùn)行的環(huán)境信息。

2.2 jstat

jstat:該命令可以插件堆內(nèi)存各部分的使用量,以及加載類的數(shù)量。命令格式如下 jstat [-命令選項(xiàng)] [vmid] [間隔時(shí)間/毫秒] [查詢次數(shù)]

- 類加載統(tǒng)計(jì)
C:\Users\lujw0>jstat -class 1128
Loaded  Bytes    Unloaded       Bytes       Time
 16315 30104.4        0           0.0       37.11

Loaded:加載class的數(shù)量
Bytes:所占用空間大小
Unloaded:未加載數(shù)量
Bytes:未加載占用空間
Time:時(shí)間

-垃圾回收統(tǒng)計(jì)
C:\Users\lujw0>jstat -gc 1128
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
5632.0 28160.0 5328.0  0.0   525824.0 463666.6  138752.0   96939.8   86912.0 82755.8 11648.0 10941.9     28    0.367   3      0.571    0.938
S0C:第一個(gè)幸存區(qū)的大小
S1C:第二個(gè)幸存區(qū)的大小
S0U:第一個(gè)幸存區(qū)的使用大小
S1U:第二個(gè)幸存區(qū)的使用大小
EC:伊甸園區(qū)的大小
EU:伊甸園區(qū)的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法區(qū)大小(元空間)
MU:方法區(qū)使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
YGC:年輕代垃圾回收次數(shù)
YGCT:年輕代垃圾回收消耗時(shí)間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

-堆內(nèi)存統(tǒng)計(jì)
C:\Users\lujw0>jstat -gccapacity 1128
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 43520.0 690176.0 583168.0 25600.0 5632.0 461312.0    87552.0  1380352.0   138752.0   138752.0      0.0 1124352.0  87168.0      0.0 1048576.0  11648.0     31     3
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:當(dāng)前新生代容量
S0C:第一個(gè)幸存區(qū)大小
S1C:第二個(gè)幸存區(qū)的大小
EC:伊甸園區(qū)的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:當(dāng)前老年代大小
OC:當(dāng)前老年代大小
MCMN:最小元數(shù)據(jù)容量
MCMX:最大元數(shù)據(jù)容量
MC:當(dāng)前元數(shù)據(jù)空間大小
CCSMN:最小壓縮類空間大小
CCSMX:最大壓縮類空間大小
CCSC:當(dāng)前壓縮類空間大小
YGC:年輕代gc次數(shù)
FGC:老年代GC次數(shù)

-新生代垃圾回收統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcnew 1128
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
25600.0 5632.0    0.0 5152.0  9  15 25600.0 461312.0 257085.0     31    0.401
S0C:第一個(gè)幸存區(qū)的大小
S1C:第二個(gè)幸存區(qū)的大小
S0U:第一個(gè)幸存區(qū)的使用大小
S1U:第二個(gè)幸存區(qū)的使用大小
TT:對象在新生代存活的次數(shù)
MTT:對象在新生代存活的最大次數(shù)
DSS:期望的幸存區(qū)大小
EC:伊甸園區(qū)的大小
EU:伊甸園區(qū)的使用大小
YGC:年輕代垃圾回收次數(shù)
YGCT:年輕代垃圾回收消耗時(shí)間

-新生代內(nèi)存統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcnewcapacity 1128
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   43520.0   690176.0   583168.0 229888.0  25600.0 229888.0   5632.0   689152.0   461312.0    31     3
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:當(dāng)前新生代容量
S0CMX:最大幸存1區(qū)大小
S0C:當(dāng)前幸存1區(qū)大小
S1CMX:最大幸存2區(qū)大小
S1C:當(dāng)前幸存2區(qū)大小
ECMX:最大伊甸園區(qū)大小
EC:當(dāng)前伊甸園區(qū)大小
YGC:年輕代垃圾回收次數(shù)
FGC:老年代回收次數(shù)

-老年代垃圾回收統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcold 1128
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 87168.0  82884.4  11648.0  10941.9    138752.0     96971.8     32     3    0.571    0.983
MC:方法區(qū)大小
MU:方法區(qū)使用大小
CCSC:壓縮類空間大小
CCSU:壓縮類空間使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年輕代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

-老年代內(nèi)存統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcoldcapacity 1128
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
    87552.0   1380352.0    138752.0    138752.0    32     3    0.571    0.983
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:當(dāng)前老年代大小
OC:老年代大小
YGC:年輕代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

-元數(shù)據(jù)空間統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcmetacapacity 1128
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1124352.0    87168.0        0.0  1048576.0    11648.0    32     3    0.571    0.983
MCMN:最小元數(shù)據(jù)容量
MCMX:最大元數(shù)據(jù)容量
MC:當(dāng)前元數(shù)據(jù)空間大小
CCSMN:最小壓縮類空間大小
CCSMX:最大壓縮類空間大小
CCSC:當(dāng)前壓縮類空間大小
YGC:年輕代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

-總結(jié)垃圾回收統(tǒng)計(jì)
C:\Users\lujw0>jstat -gcutil 1128
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 91.76   0.00  95.12  69.89  95.09  93.94     32    0.412     3    0.571    0.983
S0:幸存1區(qū)當(dāng)前使用比例
S1:幸存2區(qū)當(dāng)前使用比例
E:伊甸園區(qū)使用比例
O:老年代使用比例
M:元數(shù)據(jù)區(qū)使用比例
CCS:壓縮使用比例
YGC:年輕代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收消耗時(shí)間
GCT:垃圾回收消耗總時(shí)間

2.3、Jmap(常用)

此命令可以產(chǎn)看內(nèi)存信息

-實(shí)例個(gè)數(shù)以及占有內(nèi)存大小
C:\Users\lujw0>jmap -histo 1128 >./hmaplog.txt
 num     #instances         #bytes  class name
----------------------------------------------
   1:       1246051      216721832  [C
   2:        800697       19216728  java.lang.String
   3:         19592       12175032  [B
   4:        183451        7338040  java.util.LinkedHashMap$Entry
   5:         78428        6901664  java.lang.reflect.Method
   6:         13787        5713720  [I
   7:        201053        4825272  java.util.LinkedList$Node
   8:        190438        4570512  com.intellij.rt.debugger.agent.CaptureStorage$HardKey
   9:        105248        4209920  org.springframework.boot.devtools.filewatch.FileSnapshot
  10:        129555        4145760  java.io.File
  11:         36369        4074608  [Ljava.util.HashMap$Node;
  12:         80872        3844216  [Ljava.lang.String;
  13:        119361        3819552  java.util.concurrent.ConcurrentHashMap$Node
  14:        107645        3444640  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
  15:         53509        2703504  [Ljava.lang.Object;
  16:         80417        2573344  java.util.HashMap$Node
  17:         35803        2004968  java.util.LinkedHashMap
  18:         17368        1933400  java.lang.Class
  19:         51969        1663008  java.lang.ref.WeakReference
  20:          1122        1466832  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  21:         52470        1259280  java.util.ArrayList
  22:         57148        1256584  [Ljava.lang.Class;
  23:         15724        1132128  java.lang.reflect.Field
num:序號
instances:實(shí)例數(shù)量
bytes:占用空間大小
class name:類名稱

-堆信息
C:\Users\lujw0>jmap -heap 1128
Attaching to process ID 1128, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2120220672 (2022.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 706740224 (674.0MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 415760384 (396.5MB)
   used     = 364749400 (347.85213470458984MB)
   free     = 51010984 (48.647865295410156MB)
   87.73067710077927% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 5046320 (4.8125457763671875MB)
   free     = 196560 (0.1874542236328125MB)
   96.25091552734375% used
To Space:
   capacity = 23068672 (22.0MB)
   used     = 0 (0.0MB)
   free     = 23068672 (22.0MB)
   0.0% used
PS Old Generation
   capacity = 142082048 (135.5MB)
   used     = 99299144 (94.69904327392578MB)
   free     = 42782904 (40.80095672607422MB)
   69.88859282208544% used

42219 interned Strings occupying 4803176 bytes.

-堆內(nèi)存的dump 文件
C:\Users\lujw0>jmap -dump:format=b,file=xbootdump.hprof 1128
Dumping heap to C:\Users\lujw0\xbootdump.hprof ...
Heap dump file created
也可以設(shè)置內(nèi)存溢出自動導(dǎo)出dump文件(內(nèi)存很大的時(shí)候,可能會導(dǎo)不出來)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./   (路徑)

可以用jvisualvm命令工具導(dǎo)入該dump文件分析
C:\Users\lujw0>jvisualvm
輸入上述命令之后就會打開jdk 自帶的內(nèi)存分析工具jvisualvm

image.png

image.png

2.4、Jstack

jstack用于打印出給定的java進(jìn)程ID或core file或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64",
Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java stack和native stack的信息, 如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。

C:\Users\lujw0>jstack 1128
2020-02-22 12:16:36
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.102-b14 mixed mode):

"RMI TCP Connection(6)-192.168.5.83" #203 daemon prio=5 os_prio=0 tid=0x00000000211cc000 nid=0x38d0 runnable [0x000000002b66d000]
   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:170)
        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 <0x00000000ee61a020> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(FilterInputStream.java:83)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:550)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/1653161508.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

"JMX server connection timeout 202" #202 daemon prio=5 os_prio=0 tid=0x00000000211c4800 nid=0x3a30 in Object.wait() [0x000000002b36f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
        - locked <0x00000000ee610a10> (a [I)
        at java.lang.Thread.run(Thread.java:745)

用jstack查找死鎖,見如下示例,也可以用jvisualvm查看死鎖
新寫一個(gè)java 死鎖的程序
public class DeadLockTest {
    public static Object lock1 = new Object();
    public static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1) {
                try {
                    System.out.println("thread1 開始執(zhí)行");
                    Thread.sleep(500);
                } catch (Exception e) {
                }
                synchronized (lock2) {
                    System.out.println("thread1 執(zhí)行結(jié)束");
                }
            }
        }).start();
        new Thread(() -> {
            synchronized (lock2) {
                try {
                    System.out.println("thread2 開始執(zhí)行");
                    Thread.sleep(500);
                } catch (Exception e) {
                }
                synchronized (lock1) {
                    System.out.println("thread2 執(zhí)行結(jié)束");
                }
            }
        }).start();
    }
}

通過jstack +進(jìn)程id 也可以查看

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00000000181305a8 (object 0x00000000d6157ef0, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001812dc68 (object 0x00000000d6157f00, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.spring.study.user.test.DeadLockTest.lambda$main$1(DeadLockTest.java:33)
        - waiting to lock <0x00000000d6157ef0> (a java.lang.Object)
        - locked <0x00000000d6157f00> (a java.lang.Object)
        at com.spring.study.user.test.DeadLockTest$$Lambda$2/1792845110.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)
"Thread-0":
        at com.spring.study.user.test.DeadLockTest.lambda$main$0(DeadLockTest.java:21)
        - waiting to lock <0x00000000d6157f00> (a java.lang.Object)
        - locked <0x00000000d6157ef0> (a java.lang.Object)
        at com.spring.study.user.test.DeadLockTest$$Lambda$1/716143810.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

通過jvisualvm 查看死鎖


image.png

遠(yuǎn)程連接jvisualvm

啟動普通的jar程序JMX端口配置:
java -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

tomcat的JMX配置
JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

jvisualvm遠(yuǎn)程連接服務(wù)需要在遠(yuǎn)程服務(wù)器上配置host(連接ip 主機(jī)名),并且要關(guān)閉防火墻

image.png

jstack找出占用cpu最高的堆棧信息

1,使用命令top -p <pid> ,顯示你的java進(jìn)程的內(nèi)存情況,pid是你的java進(jìn)程號,比如4977
2,按H,獲取每個(gè)線程的內(nèi)存情況
3,找到內(nèi)存和cpu占用最高的線程tid,比如4977
4,轉(zhuǎn)為十六進(jìn)制得到 0x1371 ,此為線程id的十六進(jìn)制表示
5,執(zhí)行 jstack 4977|grep -A 10 1371,得到線程堆棧信息中1371這個(gè)線程所在行的后面10行
6,查看對應(yīng)的堆棧信息找出可能存在問題的代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容