由于还在不断的整理及发现中,更加详细的内容请查看下面的笔记链接;
——>笔记链接点这里<——
一、JPS
查看进程;Linux下也可以使用;
这里顺便提一下:ps -ef|grep 【名称】
二、jmap
2.1)查看内存信息
查看实例个数以及占用内存大小
jmap -histo 【进程编号】 > .log.txt
num #instances #bytes class name
----------------------------------------------
1: 10370916 254565072 [Ljava.lang.Object;
2: 5278512 126684288 java.util.ArrayList
3: 751837 48218336 [C
4: 7848 28051776 [I
5: 154482 12829848 [B
6: 521671 12520104 java.lang.String
7: 90121 7930648 java.lang.reflect.Method
8: 152516 4880512 java.util.HashMap$Node
9: 105352 4214080 java.util.LinkedHashMap$Entry
10: 27614 2806576 [Ljava.util.HashMap$Node;
11: 168241 2691856 java.lang.Boolean
12: 52523 2521104 java.util.HashMap
13: 97314 2335536 java.lang.Long
14: 70160 2245120 java.util.concurrent.ConcurrentHashMap$Node
15: 106564 2155608 [Ljava.lang.Class;
16: 44122 2117856 com.silk.model.entity.UserSimpleness
说明:
num:序号;
instances:实例数量
byte:占用空间大小,单位“字节”;
class name:相关的类名称;[Ljava.lang.Object;标识的是Object数组;
2.2)查看堆信息
查看进程JVM总体的情况;
jmap -heap 【进程编号】
Attaching to process ID 5272, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 734003200 (700.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 244318208 (233.0MB)
OldSize = 179306496 (171.0MB)
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 = 67108864 (64.0MB)
used = 2697928 (2.5729446411132812MB)
free = 64410936 (61.42705535888672MB)
4.020226001739502% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 118489088 (113.0MB)
used = 5147504 (4.9090423583984375MB)
free = 113341584 (108.09095764160156MB)
4.344285272918971% used
5966 interned Strings occupying 526280 bytes.
2.3)导出Dump文件
jmap -dump:format=b,file=【文件名称】.hprof 【进程编号】
导出后的Dump文件可以使用jvisualvm工具进行查看;
在系统启动中加入如下参数:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=【地址路径及文件名称】.dump
三、jstack
3.1)排除死锁问题
/**
* 类描述: 死锁演示代码
* <br />
* 运行后在控制台使用Jstack命令查看
* <p>
* 命令:jstack 【进程号】
*
* @author xxsd
* @version 1.0.0
* @date 2020/8/7 0007 下午 4:40
*/
public class DeadLockTest {
private static Object lockObject1 = new Object();
private static Object lockObject2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (lockObject1) {
try {
System.out.println("thread1 begin");
Thread.sleep(5000);
} catch (InterruptedException e) {
}
synchronized (lockObject2) {
System.out.println("thread1 end");
}
}
}).start();
new Thread(() -> {
synchronized (lockObject2) {
try {
System.out.println("thread2 begin");
Thread.sleep(5000);
} catch (InterruptedException e) {
}
synchronized (lockObject1) {
System.out.println("thread2 end");
}
}
}).start();
System.out.println("main thread end");
}
}
在控制台使用jstack 【进程号】命令后的结果为:
2020-08-07 16:46:30
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.202-b08 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000003333800 nid=0x7ef4 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001fc6e000 nid=0xa1a4 waiting for monitor entry [0x000000002052f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at lock.DeadLockTest.lambda$main$1(DeadLockTest.java:39)
- waiting to lock <0x000000076b589578> (a java.lang.Object)
- locked <0x000000076b589588> (a java.lang.Object)
at lock.DeadLockTest$Lambda$2/317574433.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001fc6d000 nid=0x5fd8 waiting for monitor entry [0x000000002042f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at lock.DeadLockTest.lambda$main$0(DeadLockTest.java:27)
- waiting to lock <0x000000076b589588> (a java.lang.Object)
- locked <0x000000076b589578> (a java.lang.Object)
at lock.DeadLockTest$Lambda$1/883049899.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001ee94800 nid=0x2ea4 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001ee00000 nid=0x5f50 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001edf1000 nid=0x5e10 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001edee800 nid=0x5e74 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001eded800 nid=0x8d80 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001edd2000 nid=0x7d98 runnable [0x000000001f52e000]
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 <0x000000076b6d1cf0> (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 <0x000000076b6d1cf0> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001ec69800 nid=0x8c6c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001ec69000 nid=0x905c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001ec50800 nid=0x1818 in Object.wait() [0x000000001f22f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b408ed0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x000000076b408ed0> (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)
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001ce4d000 nid=0x7098 in Object.wait() [0x000000001f12f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b406bf8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x000000076b406bf8> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Thread" os_prio=2 tid=0x000000001ce48800 nid=0x7c7c runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003349000 nid=0x9e1c runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000334a800 nid=0x711c runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000334c800 nid=0x8970 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000334e000 nid=0x64d4 runnable
"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000003350000 nid=0x6bb4 runnable
"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003352800 nid=0x5260 runnable
"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000003355800 nid=0x27bc runnable
"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000003356800 nid=0x6e3c runnable
"VM Periodic Task Thread" os_prio=2 tid=0x000000001ee9a800 nid=0x2894 waiting on condition
JNI global references: 317
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000001ce53588 (object 0x000000076b589578, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000001ce50cf8 (object 0x000000076b589588, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at lock.DeadLockTest.lambda$main$1(DeadLockTest.java:39)
- waiting to lock <0x000000076b589578> (a java.lang.Object)
- locked <0x000000076b589588> (a java.lang.Object)
at lock.DeadLockTest$Lambda$2/317574433.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at lock.DeadLockTest.lambda$main$0(DeadLockTest.java:27)
- waiting to lock <0x000000076b589588> (a java.lang.Object)
- locked <0x000000076b589578> (a java.lang.Object)
at lock.DeadLockTest$Lambda$1/883049899.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
"Thread-1" 线程名
prio=5 优先级=5
tid=0x000000001fc6e000线程id
nid=0x7ef4 线程对应的本地线程标识nid
java.lang.Thread.State: BLOCKED 线程状态
3.2)定位占用cpu最高的线程堆栈信息
/**
* 类描述: 线程堆栈占用CPU最高——实例Demo
* <br />
* 使用jstack找出占用CPU最高的堆栈信息
*
* @author xxsd
* @version 1.0.0
* @date 2020/8/7 0007 下午 5:04
*/
public class Math {
public static final int initData = 666;
public static User user = new User();
/**
* 功能描述:一个方法对应一块栈帧内存区域
*
* @author : xxsd
* @date : 2020/8/7 0007 下午 5:18
*/
public int compute() {
int a = 1;
int b = 3;
int c = (a + b) * 10;
return c;
}
public static void main(String[] values) {
Math math = new Math();
while (true) {
math.compute();
}
}
}
class User {
private String userName;
private String userDate;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserDate() {
return userDate;
}
public void setUserDate(String userDate) {
this.userDate = userDate;
}
}
1,使用命令top -p ,显示你的[Java](http://lib.csdn.net/base/java)进程的内存情况,pid是你的java进程号,比如19663;

2,按H,获取每个线程的内存情况 ;
3,找到内存和cpu占用最高的线程pid,比如19664 ;
4,执行 System.out.println(Integer.toHexString(19664)); 得到 0x4cd0,此为线程id的十六进制 ;
5,执行 jstack 4977|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法;
6,查看对应的堆栈信息找出可能存在问题的代码;
四、jinfo
查看正在运行的Java应用程序扩展参数;
查看JVM参数:jinfo -flags 【进程号】
查看系统参数:jinfo -sysprops 【进程号】
五、jstat
可以查看堆内存各部分的使用量,加载类的数量。
jstat -gc 【进程号】【间隔毫秒】 【打印多少次】
5.1)统计GC
jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况

- S0C:第一个幸存区的大小,单位KB
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间,单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间,单位s
- GCT:垃圾回收消耗总时间,单位s
5.2)统计堆
命令:jstat -gccapacity 【进程编号】

- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数
5.3)新生代垃圾回收统计
命令:jstat -gcnew 【进程编号】

- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
5.3)新生代内存统计
命令:jstat -gcnewcapacity 【进程编号】

- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0CMX:最大幸存1区大小
- S0C:当前幸存1区大小
- S1CMX:最大幸存2区大小
- S1C:当前幸存2区大小
- ECMX:最大伊甸园区大小
- EC:当前伊甸园区大小
- YGC:年轻代垃圾回收次数
- FGC:老年代回收次数
5.4)老年代垃圾回收统计
命令:jstat -gcold 【进程编号】

- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- OC:老年代大小
- OU:老年代使用大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
5.5)老年代内存统计
命令:jstat -gcoldcapacity 【进程编号】

- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:老年代大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
5.6)元数据空间统计
命令:jstat -gcmetacapacity 【进程编号】
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
5.6)垃圾回收单位比例
命令:jstat -gcutil 【进程编号】

- S0:幸存1区当前使用比例
- S1:幸存2区当前使用比例
- E:伊甸园区使用比例
- O:老年代使用比例
- M:元数据区使用比例
- CCS:压缩使用比例
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
六、VisualVM
远程链接参数:
java ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremote.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false ‐jar microservice‐eureka‐server.jar
说明:
-Dcom.sun.management.jmxremote.port 为远程机器的JMX端口
-Djava.rmi.server.hostname 为远程机器IP
**tomcat的JMX配置:在catalina.sh文件里的最后一个JAVA_OPTS的赋值语句下一行增加如下配置行**
JAVA_OPTS="$JAVA_OPTS ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremote.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false"