基于JDK命令行工具的监控

JVM 参数类型

标准参数

X参数

  • 非标准化参数
  • -Xint:解释执行
  • -Xcomp:第一使用就编译成本地代码
  • -Xmixed:混合模式,JVM自己来决定是否编译成本地代码

XX参数

  • Boolean类型

格式:-XX:[+-]表示启动或禁用name属性

  • 非Boolean类型

格式:-XX:=表示name属性的值是value

需要注意的是:-Xms和-Xmx虽然是以X打头,但是实际上是XX参数

  • -Xms等价于-XX:InitialHeapSize
  • -Xmx等价于-XX:MaxHeapSize

查看JVM运行时的参数

  • -XX:+PrintFlagsInitial
  • -XX:+PrintFlagsFinal
  • -XX:+UnlockExpire

=表示默认值,:=表示用户修改过后的值

1
jinfo -flag MaxHeapSize {pid}

jstat查看JVM统计信息

类加载 -class

垃圾收集 -gc

JIT编译 -compiler

JVM的内存结构

堆区:

  • Young: S0 + S1 + Eden
  • Old

非堆区(Metaspace):

  • CCS
  • CodeCache

jamp + MAT 实战内存溢出

Java里面的内存溢出是说创建的对象一直不释放

堆内存溢出
  • 构造一个List不停地添加普通对象
  • -Xmx32M, -Xms32M
非堆内存溢出
  • 构造一个List不停地添加Class对象
  • -XX:MetaspaceSize=32M, -XX:MaxMetaspaceSize=32M

如何导出内存映像文件

  • 内存溢出自动导出:
  • 使用jmap命令手动导出:jamp -demp:format=b.file=heap.hprof

MAT分析内存溢出

官网下载,将上一步的文件导入。

jstack实战死循环与死锁

监控远程普通Java进程

远程启动 Java 进程时加上如下的参数,然后通过 JvisualM 就可以通过JMX连接进行监控了。

nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port={port}
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname={ip} -jar {jar_name}.jar &

Btrace(可以考虑基于Btrace实现一个监控工具)

Btrace 本质上就是一个拦截器,可以给 Java 进程动态添加拦截,它不需要修改原有的 Java 代码,
通过一个独立进程提供监控。

  • 默认只能在本地运行
  • 生产环境下可以使用,但是被修改的字节码不会被还原
1
btrace pid {Btrace脚本}
  • 拦截方法
  • 拦截时机
  • 拦截this、参数、返回值
  • 其他

拦截方法