jconsole
JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。
命令行中输入:jconsole
jvisualvm
命令行中输入:jvisualvm
Visual GC插件下载地址 :https://visualvm.github.io/pluginscenters.html
可以监控本地的java进程的CPU,类,线程等
在线调试Arthas
Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。
github :https://github.com/alibaba/arthas
下载安装
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
or
java -jar arthas-boot.jar -h # 然后可以选择一个Java进程
输入dashboard
可查看整个进程的运行情况,线程、内存、GC、运行环境信息:
输入thread可以查看线程详细情况:
输入 thread加上线程ID 可以查看线程堆栈:
输入thread -b 可以查看线程死锁:
输入jad加类的全名可以反编译, 这样可以方便我们查看线上代码是否是正确的版本。
Arthas 命令集
基础命令:
jvm相关:
class/classloader相关:
monitor/watch/trace相关:
这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令
内存分析MAT
Java堆分析器,用于查找内存泄漏 Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照。
它在触发快照的时候保存了很多信息:Java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC。
下载地址 :https://www.eclipse.org/mat/downloads.php
获取dump文件
手动:jmap -dump:format=b,file=heap.hprof 44808
自动:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
Dump的信息:
All Objects
Class, fields, primitive values and references
All Classes
Classloader, name, super class, static fields
Garbage Collection Roots
Objects defined to be reachable by the JVM
Thread Stacks and Local Variables
The call-stacks of threads at the moment of the snapshot, and per-frame information about
local
objects
使用:
Histogram:可以列出内存中的对象,对象的个数及其大小
Class Name:类名称,java类名
Objects:类的对象的数量,这个对象被创建了多少个
Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
右击类名—>List Objects—>with incoming references—>列出该类的实例
右击Java对象名—>Merge Shortest Paths to GC Roots—>exclude all …—>找到GCRoot以及原因
Leak Suspects:查找并分析内存泄漏的可能原因:Reports—>Leak Suspects—>Details
Top Consumers:列出大对象
heaphero
https://heaphero.io/
GC日志分析
要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下,根据前面参数的学习,下
面的配置很容易看懂。比如打开windows中的catalina.bat,在第一行加上
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log
不同收集器日志
(1)Parallel GC:【吞吐量优先】
2019-06-10T23:21:53.305+0800: 1.303: [GC (Allocation Failure)
[PSYoungGen: 65536K[Young区回收前]->10748K[Young区回收后](76288K[Young区总大小])]
65536K[整个 堆回收前]->15039K[整个堆回收后](251392K[整个堆总大小]),
0.0113277 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
(2)CMS:【停顿时间优先】
参数设置:-XX:+UseConcMarkSweepGC -Xloggc:cms-gc.log
这里产生的日志格式和上面差不多。
(3)G1:【停顿时间优先】
参数设置:-XX:+UseG1GC -Xloggc:g1-gc.log
GCViewer
java -jar gcviewer-1.36-SNAPSHOT.jar
gceasy
http://gceasy.io
gcplot
https://it.gcplot.com/