基于JDK 命令行工具的监控

JVM的参数

JDK8 文档查看: https://docs.oracle.com/javase/8/docs/technotes/tools/unix

参数分类

  • 标准参数(基本不随着JVM版本变化而变化)
    • help
    • server -client
    • version - showversion
    • cp -classpath
  • x参数(非标准参数,随着JVM版本变化变化较大)
    • Xint: 解释执行
    • Xcomp: 第一使用就编译成本地代码
    • Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
  • xx参数(用处很大,随着JVM版本变化变化较大)
    • Boolean 类型
      • 格式:-XX:[+-] 表示启用或者禁用name属性
      • 例子:-XX:+UseConcMarkSweepGC
    • 非 Boolean 类型
      • 格式: -XX:=表示name属性的值是value
      • 例子:-XX:MaxGCPauseMillis=500

常用参数

jps

Lists the instrumented Java Virtual Machines (JVMs) on the target system.

列出所有虚拟机

jmap

Prints shared object memory maps or heap memory details for a process, core file, or remote debug server.

打印进程,核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。

jstat

Monitors Java Virtual Machine (JVM) statistics.

数据统计:

  • jstat -class 类加载的信息

  • jstat -gc 垃圾收集信息

  • jstat -compiler 编译信息

jmap + MAT 实战内存溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* -Xmx32M -Xms32M
* 堆内存溢出
**/
@GetMapping("/heap")
public String heap() {
int i = 0;
while(true) {
userList.add ( new User (i++, UUID.randomUUID ().toString ()) );
}
}
/*
* -XX: MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
*/
@GetMapping("/nonheap")
public String nonheap() {
while(true) {
classList.addAll ( Metaspace.createClasses () );
}
}
  • 内存溢出自动导出
1
2
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
  • 使用jmap命令手动导出

jmap -dump:format=b,file=heap.hprof (pid)

jstack 实战死循环与死锁