返回
Java程序性能优化:Linux环境下的JVM监控
后端
2023-09-08 09:23:46
JVM进程状态监控
1. jps命令
jps [options]
jps命令用于列出正在运行的Java进程。它可以显示每个进程的进程ID(PID)、主类名和启动参数。
示例:
[root@localhost ~]# jps
26183 Jps
26196 Main
输出解释:
- 26183:Jps进程的PID。
- 26196:Main进程的PID。
- Jps:Jps进程的主类名。
- Main:Main进程的主类名。
2. jstat命令
jstat [options] <pid>
jstat命令用于监控正在运行的Java进程的性能数据,如内存使用情况、类加载情况、垃圾回收情况等。
示例:
[root@localhost ~]# jstat -gc 26196
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
92160 48640 91808 3184 845184 755952 6937216 6937152 544 3952 216384 216384 33 0.104 1 0.004 0.108
92160 48640 91808 3184 845184 755952 6937216 6937152 544 3952 216384 216384 33 0.104 1 0.004 0.108
...
输出解释:
- S0C:新生代0区已使用内存量。
- S1C:新生代1区已使用内存量。
- S0U:新生代0区剩余内存量。
- S1U:新生代1区剩余内存量。
- EC:老年代已使用内存量。
- EU:老年代剩余内存量。
- OC:堆外内存已使用内存量。
- OU:堆外内存剩余内存量。
- MC:元空间已使用内存量。
- MU:元空间剩余内存量。
- CCSC:编译器代码缓存已使用内存量。
- CCSU:编译器代码缓存剩余内存量。
- YGC:年轻代垃圾回收次数。
- YGCT:年轻代垃圾回收总时间。
- FGC:老年代垃圾回收次数。
- FGCT:老年代垃圾回收总时间。
- GCT:总垃圾回收时间。
3. jstack命令
jstack <pid>
jstack命令用于打印正在运行的Java进程的线程堆栈信息。它可以帮助您诊断线程死锁、死循环等问题。
示例:
[root@localhost ~]# jstack 26196
"main" #1 daemon prio=5 os_prio=0 tid=0x00007f120068d800 nid=0x1a3b runnable [0x00007f11c1e04000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
- locked <0x00000005e411c490> (a java.io.FileDescriptor)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at java.nio.channels.Selector.read(Selector.java:434)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:216)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
...
输出解释:
- "main":主线程的名称。
- #1:主线程的ID。
- daemon:主线程是否为守护线程。
- prio=5:主线程的优先级。
- os_prio=0:主线程的操作系统优先级。
- tid=0x00007f120068d800:主线程的线程ID。
- nid=0x1a3b:主线程的本地线程ID。
- runnable:主线程的状态。
- [0x00007f11c1e04000]:主线程的栈桢信息。
JVM内存监控
1. jmap命令
jmap [options] <pid>
jmap命令用于打印正在运行的Java进程的内存信息,如堆内存使用情况、类信息、线程信息等。
示例:
[root@localhost ~]# jmap -heap 26196
Attaching to process 26196, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02
Deadlock detection is disabled.
Heap
def new generation total 92160K, used 56498K [0x00000006e8600000, 0x00000006ea100000, 0x00000006ea100000)
eden space 81920K, 69% used [0x00000006e8600000, 0x00000006e9887a20, 0x00000006ea100000)
from space 10240K, 0% used [0x00000006ea000000, 0x00000006ea000000, 0x00000006ea100000)
to space 10240K, 0% used [0x00000006e9887a20, 0x00000006e9887a20, 0x00000006ea000000)
tenured generation total 6937216K, used 234896K [0x0000000696800000, 0x00000006c1200000, 0x00000006ea100000)
the space 6937216K, 3% used [0x0000000696800000, 0x00000006993b0fb0, 0x00000006c1200000)
compaction space total 25165824K, used 0K [0x00000006c1200000, 0