目录
一、GC日志可视化分析工具
1. 概述
2. GCeasy
3. GCPlot
4. JClarity
5. GcViewer
二、JVM状态可视化(JVisualVM)
1. 概述
2. 运行
3. 安装插件
4. 远程监控
4.1 jstatd连接
4.2 JMX连接(以Tomcat为例)
本文选取https://fasterj.com/tools/gcloganalysers.shtml 中按更新日期排序的GC日志分析工具的前四个,好处:目前都还有人维护;
实验GC日志生成参数:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/Desktop/gc.txt;
JDK8;macOS;
工具包含主要指标(Metrics):JVM Heap Size(Generation / Allocated space / before GC / after GC);Throughput;Pause(Minor GC / Full GC / count);Reclaimed Bytes;GC count;GC causes;Allocatied Objects Size;Promoted Object Size;created bytes;
本地部署的工具比在线工具快;
部署 https://gceasy.io/index.jsp#features
1. 将GC日志文件gc.txt压缩成zip;
2. 访问https://gceasy.io/index.jsp#features,完全在线,上传zip;
3. Analyze,多等一会,将会展示数据和图表;
部署(同官网)https://gcplot.com/
1. 安装docker;
2. 在终端运行命令:docker run -d -p 80:80 gcplot/gcplot;
3. 在浏览器访问地址:http://127.0.0.1;用户名和密码,均为admin;
4. General --> Upload GC Log --> 选择文件 --> 点击Upload按钮;
5. Analysis Groups --> Files --> 点击上传的GC日志gc.txt --> 将会JVM info,指标按tab页分类;
部署(付费)https://www.jclarity.com/censum/
1. 在官网选择试用,填写信息(邮箱),将会收到下载地址和uuid;
2. 在下载页输入邮箱、uuid、操作系统,点击submit,将会收到包含licence key的邮件,浏览器将下载安装包;
3. (macOS下载tgz)双击tgz文件,将解压后目录下的文件移动到应用程序目录下,在启动台点击icon运行;
4. 首次运行输入licence key;
5. 点击Analyse a GC Log;上传GC日志文件gc.txt;
6. 将会展示分析结果和建议(ANALYTICS,如?图所示)、图表和数据(GRAPHS AND DATA);
部署 https://github.com/chewiebug/GCViewer
1. 下载工程;
2. 在Intellij idea中打开;运行com.tagtraum.perf.gcviewer.GCViewer类的main函数;
3. 点击左上角打开GC日志文件gc.txt;(View菜单可调整折线图及图例,图表分辨率可调整,如下?图)
建议与被监控程序运行在不同机器上(远程监控)。
安装插件让JVisualVM完整。(常用:Virsul GC、MBeans)
在$JAVA_HOME/bin目录下,运行jvisualvm命令
启动时多等一会,将会在左侧菜单栏看见本地Java应用
JVisualVM插件说明 https://visualvm.github.io/plugins.html
菜单栏 --> 工具(T) --> 插件(P) --> 可用插件 --> 全选,安装
配置JConsole Plugins
1. 下载https://github.com/TheLQ/GamersClub/tree/master/build/bcf736a518834fe7aa689d74d5ca1b/demo/management/JTop JTop.jar;
2. 左侧菜单栏,本地 --> 双击VisualVM,进入VisualVM监控页--> 在右侧监控页,选择"JConsole Plugins" tab页,看见no jconsole plugin installed提示,点击configure plugins按钮,将JTop.jar添加进来,应用并重启JVisualVM;
远程机器操作系统:Linux
1. 在/etc/hosts文件末尾增加一行:
该机器ip(可通过ifconfig命令获得) hostname(可通过hostname命令获得)
2. 在远程机器$JAVA_HOME/bin目录下,新建jstatd.all.policy文件,内容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
3. 在远程机器$JAVA_HOME/bin目录下,执行命令:jstatd -J-Djava.security.policy=jstatd.all.policy &,将后台运行,执行成功情况下不输出任何信息;
4. 测试是否能远程监控Java程序,在本机执行命令:jps 远程机器ip,将输出远程机器上的Java进程
5. JVisualVM左侧菜单栏,远程,右键 --> 添加远程主机 --> 输入远程主机IP --> 左侧菜单栏,远程主机IP上右键 --> 添加jstatd连接,默认端口1099;若成功,左侧菜单栏远程主机IP下,将看到jstatd进程及其它运行在远程主机上的Java进程,以及它们的pid;
1. 编辑Tomcat的bin目录下的catalina.sh,在首部注释块之后添加:(jmxremote.port端口号可修改为任一未被占用的端口号)
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
2. 重启Tomcat;(配置了JMX连接的Tomcat,shutdown关闭时会报错误,无法关闭,Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 9999; 此时kill -9 杀死占用9999端口的进程即可,即关闭Tomcat进程;)
3. JVisualVM左侧菜单栏 --> 远程主机IP上右键 --> 添加JMX连接 --> IP后添加jmxremote.port指定的端口号,勾选不要求SSL连接;若成功,左侧菜单栏远程主机IP下,将看到带JMX logo的进程;
使用安全凭证,可参考:https://www.cnblogs.com/sunshine-2015/p/5547128.html