返回

Java程序性能优化:Linux环境下的JVM监控

后端

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