JVM Analazy

Visual VM

Plugin

查看DirectMemory:Buffer Pools 和 MBeans Browser


jmap

Usage

查看当前存活对象统计

1
2
3
4
jmap -histo:live pid

# 仅看前10个
jmap -histo:live 42374 | head -10
1
jmap -dump:format=b,file=heap.bin pid

jstat

使用举例

  1. 需要每250毫秒查询一次进程2849 垃圾收集状况,一共查询20次
1
jstat -gc 2849 250 20

输出结果说明

  • S0 — Heap上的 Survivor space 0 区已使用空间的百分比
  • S1 — Heap上的 Survivor space 1 区已使用空间的百分比
  • E — Heap上的 Eden space 区已使用空间的百分比
  • O — Heap上的 Old space 区已使用空间的百分比
  • P — Perm space 区已使用空间的百分比
  • YGC — 从应用程序启动到采样时发生 Young GC 的次数
  • YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
  • FGC — 从应用程序启动到采样时发生 Full GC 的次数
  • FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
  • GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

  • S0C: Current survivor space 0 capacity (kB).
  • S1C: Current survivor space 1 capacity (kB).
  • S0U: Survivor space 0 utilization (kB).
  • S1U: Survivor space 1 utilization (kB).
  • EC: Current eden space capacity (kB).
  • EU: Eden space utilization (kB).
  • OC: Current old space capacity (kB).
  • OU: Old space utilization (kB).
  • MC: Metaspace capacity (kB).
  • MU: Metacspace utilization (kB).
  • CCSC: Compressed class space capacity (kB).
  • CCSU: Compressed class space used (kB).
  • YGC: Number of young generation garbage collection events.
  • YGCT: Young generation garbage collection time.
  • FGC: Number of full GC events.
  • FGCT: Full garbage collection time.
  • GCT: Total garbage collection time.

jstack

Java Stack Trace,Java堆栈跟踪工具

这个命令用于查看虚拟机当前时刻的线程快照(一般是threaddump 或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,入线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情。


jconsole

一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了

docker

1
2
3
4
5
6
7
8
9
10
11
12
CMD ["java", \
"-server", \
"-Xms1g", \
"-Xmx30g", \
"-Dcom.sun.management.jmxremote=true",\
"-Dcom.sun.management.jmxremote.port=9000", \
"-Dcom.sun.management.jmxremote.authenticate=false",\
"-Dcom.sun.management.jmxremote.ssl=false", \
"-Djava.rmi.server.hostname=localhost", \
"-Dcom.sun.management.jmxremote.rmi.port=9000", \
"-jar", \
"/root/root.war"]

Error

Unable to open socket file: target process not responding or HotSpot VM not loaded

使用openJDK造成的,改用Oracle JDK即可

https://hub.docker.com/r/anapsix/alpine-java/

参考链接

https://www.jianshu.com/p/25e94a1399a0